mirror of
https://github.com/bkaradzic/bgfx.git
synced 2026-02-17 20:52:36 +01:00
Updated spirv-tools.
This commit is contained in:
@@ -1 +1 @@
|
||||
"v2022.2-dev", "SPIRV-Tools v2022.2-dev 6875e96bcbc938fb6a208e1c5c630a32bfeef49d"
|
||||
"v2022.2-dev", "SPIRV-Tools v2022.2-dev 8f96b8ade7aed1a3448c9cd0294449e7a41b91f7"
|
||||
|
||||
@@ -40,6 +40,7 @@ static const SpvCapability pygen_variable_caps_KernelImageQuery[] = {SpvCapabili
|
||||
static const SpvCapability pygen_variable_caps_LiteralSampler[] = {SpvCapabilityLiteralSampler};
|
||||
static const SpvCapability pygen_variable_caps_LongConstantCompositeINTEL[] = {SpvCapabilityLongConstantCompositeINTEL};
|
||||
static const SpvCapability pygen_variable_caps_Matrix[] = {SpvCapabilityMatrix};
|
||||
static const SpvCapability pygen_variable_caps_MemoryAccessAliasingINTEL[] = {SpvCapabilityMemoryAccessAliasingINTEL};
|
||||
static const SpvCapability pygen_variable_caps_MeshShadingNV[] = {SpvCapabilityMeshShadingNV};
|
||||
static const SpvCapability pygen_variable_caps_NamedBarrier[] = {SpvCapabilityNamedBarrier};
|
||||
static const SpvCapability pygen_variable_caps_PipeStorage[] = {SpvCapabilityPipeStorage};
|
||||
@@ -80,6 +81,7 @@ static const spvtools::Extension pygen_variable_exts_SPV_GOOGLE_hlsl_functionali
|
||||
static const spvtools::Extension pygen_variable_exts_SPV_INTEL_blocking_pipes[] = {spvtools::Extension::kSPV_INTEL_blocking_pipes};
|
||||
static const spvtools::Extension pygen_variable_exts_SPV_INTEL_fpga_reg[] = {spvtools::Extension::kSPV_INTEL_fpga_reg};
|
||||
static const spvtools::Extension pygen_variable_exts_SPV_INTEL_function_pointers[] = {spvtools::Extension::kSPV_INTEL_function_pointers};
|
||||
static const spvtools::Extension pygen_variable_exts_SPV_INTEL_memory_access_aliasing[] = {spvtools::Extension::kSPV_INTEL_memory_access_aliasing};
|
||||
static const spvtools::Extension pygen_variable_exts_SPV_INTEL_unstructured_loop_controls[] = {spvtools::Extension::kSPV_INTEL_unstructured_loop_controls};
|
||||
static const spvtools::Extension pygen_variable_exts_SPV_KHR_expect_assume[] = {spvtools::Extension::kSPV_KHR_expect_assume};
|
||||
static const spvtools::Extension pygen_variable_exts_SPV_KHR_integer_dot_product[] = {spvtools::Extension::kSPV_KHR_integer_dot_product};
|
||||
@@ -716,6 +718,9 @@ static const spv_opcode_desc_t kOpcodeTableEntries[] = {
|
||||
{"ArbitraryFloatPowRINTEL", SpvOpArbitraryFloatPowRINTEL, 1, pygen_variable_caps_ArbitraryPrecisionFloatingPointINTEL, 10, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_LITERAL_INTEGER}, 1, 1, 0, nullptr, 0xffffffffu, 0xffffffffu},
|
||||
{"ArbitraryFloatPowNINTEL", SpvOpArbitraryFloatPowNINTEL, 1, pygen_variable_caps_ArbitraryPrecisionFloatingPointINTEL, 9, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_LITERAL_INTEGER}, 1, 1, 0, nullptr, 0xffffffffu, 0xffffffffu},
|
||||
{"LoopControlINTEL", SpvOpLoopControlINTEL, 1, pygen_variable_caps_UnstructuredLoopControlsINTEL, 1, {SPV_OPERAND_TYPE_VARIABLE_LITERAL_INTEGER}, 0, 0, 1, pygen_variable_exts_SPV_INTEL_unstructured_loop_controls, 0xffffffffu, 0xffffffffu},
|
||||
{"AliasDomainDeclINTEL", SpvOpAliasDomainDeclINTEL, 1, pygen_variable_caps_MemoryAccessAliasingINTEL, 2, {SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_OPTIONAL_ID}, 1, 0, 1, pygen_variable_exts_SPV_INTEL_memory_access_aliasing, 0xffffffffu, 0xffffffffu},
|
||||
{"AliasScopeDeclINTEL", SpvOpAliasScopeDeclINTEL, 1, pygen_variable_caps_MemoryAccessAliasingINTEL, 3, {SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_OPTIONAL_ID}, 1, 0, 1, pygen_variable_exts_SPV_INTEL_memory_access_aliasing, 0xffffffffu, 0xffffffffu},
|
||||
{"AliasScopeListDeclINTEL", SpvOpAliasScopeListDeclINTEL, 1, pygen_variable_caps_MemoryAccessAliasingINTEL, 2, {SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_VARIABLE_ID}, 1, 0, 1, pygen_variable_exts_SPV_INTEL_memory_access_aliasing, 0xffffffffu, 0xffffffffu},
|
||||
{"FixedSqrtINTEL", SpvOpFixedSqrtINTEL, 1, pygen_variable_caps_ArbitraryPrecisionFixedPointINTEL, 9, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_LITERAL_INTEGER}, 1, 1, 0, nullptr, 0xffffffffu, 0xffffffffu},
|
||||
{"FixedRecipINTEL", SpvOpFixedRecipINTEL, 1, pygen_variable_caps_ArbitraryPrecisionFixedPointINTEL, 9, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_LITERAL_INTEGER}, 1, 1, 0, nullptr, 0xffffffffu, 0xffffffffu},
|
||||
{"FixedRsqrtINTEL", SpvOpFixedRsqrtINTEL, 1, pygen_variable_caps_ArbitraryPrecisionFixedPointINTEL, 9, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_LITERAL_INTEGER}, 1, 1, 0, nullptr, 0xffffffffu, 0xffffffffu},
|
||||
|
||||
@@ -92,6 +92,8 @@ const char* ExtensionToString(Extension extension) {
|
||||
return "SPV_INTEL_loop_fuse";
|
||||
case Extension::kSPV_INTEL_media_block_io:
|
||||
return "SPV_INTEL_media_block_io";
|
||||
case Extension::kSPV_INTEL_memory_access_aliasing:
|
||||
return "SPV_INTEL_memory_access_aliasing";
|
||||
case Extension::kSPV_INTEL_optnone:
|
||||
return "SPV_INTEL_optnone";
|
||||
case Extension::kSPV_INTEL_shader_integer_functions2:
|
||||
@@ -203,8 +205,8 @@ const char* ExtensionToString(Extension extension) {
|
||||
|
||||
|
||||
bool GetExtensionFromString(const char* str, Extension* extension) {
|
||||
static const char* known_ext_strs[] = { "SPV_AMD_gcn_shader", "SPV_AMD_gpu_shader_half_float", "SPV_AMD_gpu_shader_half_float_fetch", "SPV_AMD_gpu_shader_int16", "SPV_AMD_shader_ballot", "SPV_AMD_shader_explicit_vertex_parameter", "SPV_AMD_shader_fragment_mask", "SPV_AMD_shader_image_load_store_lod", "SPV_AMD_shader_trinary_minmax", "SPV_AMD_texture_gather_bias_lod", "SPV_EXT_demote_to_helper_invocation", "SPV_EXT_descriptor_indexing", "SPV_EXT_fragment_fully_covered", "SPV_EXT_fragment_invocation_density", "SPV_EXT_fragment_shader_interlock", "SPV_EXT_physical_storage_buffer", "SPV_EXT_shader_atomic_float16_add", "SPV_EXT_shader_atomic_float_add", "SPV_EXT_shader_atomic_float_min_max", "SPV_EXT_shader_image_int64", "SPV_EXT_shader_stencil_export", "SPV_EXT_shader_viewport_index_layer", "SPV_GOOGLE_decorate_string", "SPV_GOOGLE_hlsl_functionality1", "SPV_GOOGLE_user_type", "SPV_INTEL_arbitrary_precision_fixed_point", "SPV_INTEL_arbitrary_precision_floating_point", "SPV_INTEL_arbitrary_precision_integers", "SPV_INTEL_blocking_pipes", "SPV_INTEL_debug_module", "SPV_INTEL_device_side_avc_motion_estimation", "SPV_INTEL_float_controls2", "SPV_INTEL_fp_fast_math_mode", "SPV_INTEL_fpga_buffer_location", "SPV_INTEL_fpga_cluster_attributes", "SPV_INTEL_fpga_loop_controls", "SPV_INTEL_fpga_memory_accesses", "SPV_INTEL_fpga_memory_attributes", "SPV_INTEL_fpga_reg", "SPV_INTEL_function_pointers", "SPV_INTEL_inline_assembly", "SPV_INTEL_io_pipes", "SPV_INTEL_kernel_attributes", "SPV_INTEL_long_constant_composite", "SPV_INTEL_loop_fuse", "SPV_INTEL_media_block_io", "SPV_INTEL_optnone", "SPV_INTEL_shader_integer_functions2", "SPV_INTEL_subgroups", "SPV_INTEL_unstructured_loop_controls", "SPV_INTEL_usm_storage_classes", "SPV_INTEL_variable_length_array", "SPV_INTEL_vector_compute", "SPV_KHR_16bit_storage", "SPV_KHR_8bit_storage", "SPV_KHR_bit_instructions", "SPV_KHR_device_group", "SPV_KHR_expect_assume", "SPV_KHR_float_controls", "SPV_KHR_fragment_shader_barycentric", "SPV_KHR_fragment_shading_rate", "SPV_KHR_integer_dot_product", "SPV_KHR_linkonce_odr", "SPV_KHR_multiview", "SPV_KHR_no_integer_wrap_decoration", "SPV_KHR_non_semantic_info", "SPV_KHR_physical_storage_buffer", "SPV_KHR_post_depth_coverage", "SPV_KHR_ray_query", "SPV_KHR_ray_tracing", "SPV_KHR_shader_atomic_counter_ops", "SPV_KHR_shader_ballot", "SPV_KHR_shader_clock", "SPV_KHR_shader_draw_parameters", "SPV_KHR_storage_buffer_storage_class", "SPV_KHR_subgroup_uniform_control_flow", "SPV_KHR_subgroup_vote", "SPV_KHR_terminate_invocation", "SPV_KHR_variable_pointers", "SPV_KHR_vulkan_memory_model", "SPV_KHR_workgroup_memory_explicit_layout", "SPV_NVX_multiview_per_view_attributes", "SPV_NV_bindless_texture", "SPV_NV_compute_shader_derivatives", "SPV_NV_cooperative_matrix", "SPV_NV_fragment_shader_barycentric", "SPV_NV_geometry_shader_passthrough", "SPV_NV_mesh_shader", "SPV_NV_ray_tracing", "SPV_NV_ray_tracing_motion_blur", "SPV_NV_sample_mask_override_coverage", "SPV_NV_shader_image_footprint", "SPV_NV_shader_sm_builtins", "SPV_NV_shader_subgroup_partitioned", "SPV_NV_shading_rate", "SPV_NV_stereo_view_rendering", "SPV_NV_viewport_array2", "SPV_VALIDATOR_ignore_type_decl_unique" };
|
||||
static const Extension known_ext_ids[] = { Extension::kSPV_AMD_gcn_shader, Extension::kSPV_AMD_gpu_shader_half_float, Extension::kSPV_AMD_gpu_shader_half_float_fetch, Extension::kSPV_AMD_gpu_shader_int16, Extension::kSPV_AMD_shader_ballot, Extension::kSPV_AMD_shader_explicit_vertex_parameter, Extension::kSPV_AMD_shader_fragment_mask, Extension::kSPV_AMD_shader_image_load_store_lod, Extension::kSPV_AMD_shader_trinary_minmax, Extension::kSPV_AMD_texture_gather_bias_lod, Extension::kSPV_EXT_demote_to_helper_invocation, Extension::kSPV_EXT_descriptor_indexing, Extension::kSPV_EXT_fragment_fully_covered, Extension::kSPV_EXT_fragment_invocation_density, Extension::kSPV_EXT_fragment_shader_interlock, Extension::kSPV_EXT_physical_storage_buffer, Extension::kSPV_EXT_shader_atomic_float16_add, Extension::kSPV_EXT_shader_atomic_float_add, Extension::kSPV_EXT_shader_atomic_float_min_max, Extension::kSPV_EXT_shader_image_int64, Extension::kSPV_EXT_shader_stencil_export, Extension::kSPV_EXT_shader_viewport_index_layer, Extension::kSPV_GOOGLE_decorate_string, Extension::kSPV_GOOGLE_hlsl_functionality1, Extension::kSPV_GOOGLE_user_type, Extension::kSPV_INTEL_arbitrary_precision_fixed_point, Extension::kSPV_INTEL_arbitrary_precision_floating_point, Extension::kSPV_INTEL_arbitrary_precision_integers, Extension::kSPV_INTEL_blocking_pipes, Extension::kSPV_INTEL_debug_module, Extension::kSPV_INTEL_device_side_avc_motion_estimation, Extension::kSPV_INTEL_float_controls2, Extension::kSPV_INTEL_fp_fast_math_mode, Extension::kSPV_INTEL_fpga_buffer_location, Extension::kSPV_INTEL_fpga_cluster_attributes, Extension::kSPV_INTEL_fpga_loop_controls, Extension::kSPV_INTEL_fpga_memory_accesses, Extension::kSPV_INTEL_fpga_memory_attributes, Extension::kSPV_INTEL_fpga_reg, Extension::kSPV_INTEL_function_pointers, Extension::kSPV_INTEL_inline_assembly, Extension::kSPV_INTEL_io_pipes, Extension::kSPV_INTEL_kernel_attributes, Extension::kSPV_INTEL_long_constant_composite, Extension::kSPV_INTEL_loop_fuse, Extension::kSPV_INTEL_media_block_io, Extension::kSPV_INTEL_optnone, Extension::kSPV_INTEL_shader_integer_functions2, Extension::kSPV_INTEL_subgroups, Extension::kSPV_INTEL_unstructured_loop_controls, Extension::kSPV_INTEL_usm_storage_classes, Extension::kSPV_INTEL_variable_length_array, Extension::kSPV_INTEL_vector_compute, Extension::kSPV_KHR_16bit_storage, Extension::kSPV_KHR_8bit_storage, Extension::kSPV_KHR_bit_instructions, Extension::kSPV_KHR_device_group, Extension::kSPV_KHR_expect_assume, Extension::kSPV_KHR_float_controls, Extension::kSPV_KHR_fragment_shader_barycentric, Extension::kSPV_KHR_fragment_shading_rate, Extension::kSPV_KHR_integer_dot_product, Extension::kSPV_KHR_linkonce_odr, Extension::kSPV_KHR_multiview, Extension::kSPV_KHR_no_integer_wrap_decoration, Extension::kSPV_KHR_non_semantic_info, Extension::kSPV_KHR_physical_storage_buffer, Extension::kSPV_KHR_post_depth_coverage, Extension::kSPV_KHR_ray_query, Extension::kSPV_KHR_ray_tracing, Extension::kSPV_KHR_shader_atomic_counter_ops, Extension::kSPV_KHR_shader_ballot, Extension::kSPV_KHR_shader_clock, Extension::kSPV_KHR_shader_draw_parameters, Extension::kSPV_KHR_storage_buffer_storage_class, Extension::kSPV_KHR_subgroup_uniform_control_flow, Extension::kSPV_KHR_subgroup_vote, Extension::kSPV_KHR_terminate_invocation, Extension::kSPV_KHR_variable_pointers, Extension::kSPV_KHR_vulkan_memory_model, Extension::kSPV_KHR_workgroup_memory_explicit_layout, Extension::kSPV_NVX_multiview_per_view_attributes, Extension::kSPV_NV_bindless_texture, Extension::kSPV_NV_compute_shader_derivatives, Extension::kSPV_NV_cooperative_matrix, Extension::kSPV_NV_fragment_shader_barycentric, Extension::kSPV_NV_geometry_shader_passthrough, Extension::kSPV_NV_mesh_shader, Extension::kSPV_NV_ray_tracing, Extension::kSPV_NV_ray_tracing_motion_blur, Extension::kSPV_NV_sample_mask_override_coverage, Extension::kSPV_NV_shader_image_footprint, Extension::kSPV_NV_shader_sm_builtins, Extension::kSPV_NV_shader_subgroup_partitioned, Extension::kSPV_NV_shading_rate, Extension::kSPV_NV_stereo_view_rendering, Extension::kSPV_NV_viewport_array2, Extension::kSPV_VALIDATOR_ignore_type_decl_unique };
|
||||
static const char* known_ext_strs[] = { "SPV_AMD_gcn_shader", "SPV_AMD_gpu_shader_half_float", "SPV_AMD_gpu_shader_half_float_fetch", "SPV_AMD_gpu_shader_int16", "SPV_AMD_shader_ballot", "SPV_AMD_shader_explicit_vertex_parameter", "SPV_AMD_shader_fragment_mask", "SPV_AMD_shader_image_load_store_lod", "SPV_AMD_shader_trinary_minmax", "SPV_AMD_texture_gather_bias_lod", "SPV_EXT_demote_to_helper_invocation", "SPV_EXT_descriptor_indexing", "SPV_EXT_fragment_fully_covered", "SPV_EXT_fragment_invocation_density", "SPV_EXT_fragment_shader_interlock", "SPV_EXT_physical_storage_buffer", "SPV_EXT_shader_atomic_float16_add", "SPV_EXT_shader_atomic_float_add", "SPV_EXT_shader_atomic_float_min_max", "SPV_EXT_shader_image_int64", "SPV_EXT_shader_stencil_export", "SPV_EXT_shader_viewport_index_layer", "SPV_GOOGLE_decorate_string", "SPV_GOOGLE_hlsl_functionality1", "SPV_GOOGLE_user_type", "SPV_INTEL_arbitrary_precision_fixed_point", "SPV_INTEL_arbitrary_precision_floating_point", "SPV_INTEL_arbitrary_precision_integers", "SPV_INTEL_blocking_pipes", "SPV_INTEL_debug_module", "SPV_INTEL_device_side_avc_motion_estimation", "SPV_INTEL_float_controls2", "SPV_INTEL_fp_fast_math_mode", "SPV_INTEL_fpga_buffer_location", "SPV_INTEL_fpga_cluster_attributes", "SPV_INTEL_fpga_loop_controls", "SPV_INTEL_fpga_memory_accesses", "SPV_INTEL_fpga_memory_attributes", "SPV_INTEL_fpga_reg", "SPV_INTEL_function_pointers", "SPV_INTEL_inline_assembly", "SPV_INTEL_io_pipes", "SPV_INTEL_kernel_attributes", "SPV_INTEL_long_constant_composite", "SPV_INTEL_loop_fuse", "SPV_INTEL_media_block_io", "SPV_INTEL_memory_access_aliasing", "SPV_INTEL_optnone", "SPV_INTEL_shader_integer_functions2", "SPV_INTEL_subgroups", "SPV_INTEL_unstructured_loop_controls", "SPV_INTEL_usm_storage_classes", "SPV_INTEL_variable_length_array", "SPV_INTEL_vector_compute", "SPV_KHR_16bit_storage", "SPV_KHR_8bit_storage", "SPV_KHR_bit_instructions", "SPV_KHR_device_group", "SPV_KHR_expect_assume", "SPV_KHR_float_controls", "SPV_KHR_fragment_shader_barycentric", "SPV_KHR_fragment_shading_rate", "SPV_KHR_integer_dot_product", "SPV_KHR_linkonce_odr", "SPV_KHR_multiview", "SPV_KHR_no_integer_wrap_decoration", "SPV_KHR_non_semantic_info", "SPV_KHR_physical_storage_buffer", "SPV_KHR_post_depth_coverage", "SPV_KHR_ray_query", "SPV_KHR_ray_tracing", "SPV_KHR_shader_atomic_counter_ops", "SPV_KHR_shader_ballot", "SPV_KHR_shader_clock", "SPV_KHR_shader_draw_parameters", "SPV_KHR_storage_buffer_storage_class", "SPV_KHR_subgroup_uniform_control_flow", "SPV_KHR_subgroup_vote", "SPV_KHR_terminate_invocation", "SPV_KHR_variable_pointers", "SPV_KHR_vulkan_memory_model", "SPV_KHR_workgroup_memory_explicit_layout", "SPV_NVX_multiview_per_view_attributes", "SPV_NV_bindless_texture", "SPV_NV_compute_shader_derivatives", "SPV_NV_cooperative_matrix", "SPV_NV_fragment_shader_barycentric", "SPV_NV_geometry_shader_passthrough", "SPV_NV_mesh_shader", "SPV_NV_ray_tracing", "SPV_NV_ray_tracing_motion_blur", "SPV_NV_sample_mask_override_coverage", "SPV_NV_shader_image_footprint", "SPV_NV_shader_sm_builtins", "SPV_NV_shader_subgroup_partitioned", "SPV_NV_shading_rate", "SPV_NV_stereo_view_rendering", "SPV_NV_viewport_array2", "SPV_VALIDATOR_ignore_type_decl_unique" };
|
||||
static const Extension known_ext_ids[] = { Extension::kSPV_AMD_gcn_shader, Extension::kSPV_AMD_gpu_shader_half_float, Extension::kSPV_AMD_gpu_shader_half_float_fetch, Extension::kSPV_AMD_gpu_shader_int16, Extension::kSPV_AMD_shader_ballot, Extension::kSPV_AMD_shader_explicit_vertex_parameter, Extension::kSPV_AMD_shader_fragment_mask, Extension::kSPV_AMD_shader_image_load_store_lod, Extension::kSPV_AMD_shader_trinary_minmax, Extension::kSPV_AMD_texture_gather_bias_lod, Extension::kSPV_EXT_demote_to_helper_invocation, Extension::kSPV_EXT_descriptor_indexing, Extension::kSPV_EXT_fragment_fully_covered, Extension::kSPV_EXT_fragment_invocation_density, Extension::kSPV_EXT_fragment_shader_interlock, Extension::kSPV_EXT_physical_storage_buffer, Extension::kSPV_EXT_shader_atomic_float16_add, Extension::kSPV_EXT_shader_atomic_float_add, Extension::kSPV_EXT_shader_atomic_float_min_max, Extension::kSPV_EXT_shader_image_int64, Extension::kSPV_EXT_shader_stencil_export, Extension::kSPV_EXT_shader_viewport_index_layer, Extension::kSPV_GOOGLE_decorate_string, Extension::kSPV_GOOGLE_hlsl_functionality1, Extension::kSPV_GOOGLE_user_type, Extension::kSPV_INTEL_arbitrary_precision_fixed_point, Extension::kSPV_INTEL_arbitrary_precision_floating_point, Extension::kSPV_INTEL_arbitrary_precision_integers, Extension::kSPV_INTEL_blocking_pipes, Extension::kSPV_INTEL_debug_module, Extension::kSPV_INTEL_device_side_avc_motion_estimation, Extension::kSPV_INTEL_float_controls2, Extension::kSPV_INTEL_fp_fast_math_mode, Extension::kSPV_INTEL_fpga_buffer_location, Extension::kSPV_INTEL_fpga_cluster_attributes, Extension::kSPV_INTEL_fpga_loop_controls, Extension::kSPV_INTEL_fpga_memory_accesses, Extension::kSPV_INTEL_fpga_memory_attributes, Extension::kSPV_INTEL_fpga_reg, Extension::kSPV_INTEL_function_pointers, Extension::kSPV_INTEL_inline_assembly, Extension::kSPV_INTEL_io_pipes, Extension::kSPV_INTEL_kernel_attributes, Extension::kSPV_INTEL_long_constant_composite, Extension::kSPV_INTEL_loop_fuse, Extension::kSPV_INTEL_media_block_io, Extension::kSPV_INTEL_memory_access_aliasing, Extension::kSPV_INTEL_optnone, Extension::kSPV_INTEL_shader_integer_functions2, Extension::kSPV_INTEL_subgroups, Extension::kSPV_INTEL_unstructured_loop_controls, Extension::kSPV_INTEL_usm_storage_classes, Extension::kSPV_INTEL_variable_length_array, Extension::kSPV_INTEL_vector_compute, Extension::kSPV_KHR_16bit_storage, Extension::kSPV_KHR_8bit_storage, Extension::kSPV_KHR_bit_instructions, Extension::kSPV_KHR_device_group, Extension::kSPV_KHR_expect_assume, Extension::kSPV_KHR_float_controls, Extension::kSPV_KHR_fragment_shader_barycentric, Extension::kSPV_KHR_fragment_shading_rate, Extension::kSPV_KHR_integer_dot_product, Extension::kSPV_KHR_linkonce_odr, Extension::kSPV_KHR_multiview, Extension::kSPV_KHR_no_integer_wrap_decoration, Extension::kSPV_KHR_non_semantic_info, Extension::kSPV_KHR_physical_storage_buffer, Extension::kSPV_KHR_post_depth_coverage, Extension::kSPV_KHR_ray_query, Extension::kSPV_KHR_ray_tracing, Extension::kSPV_KHR_shader_atomic_counter_ops, Extension::kSPV_KHR_shader_ballot, Extension::kSPV_KHR_shader_clock, Extension::kSPV_KHR_shader_draw_parameters, Extension::kSPV_KHR_storage_buffer_storage_class, Extension::kSPV_KHR_subgroup_uniform_control_flow, Extension::kSPV_KHR_subgroup_vote, Extension::kSPV_KHR_terminate_invocation, Extension::kSPV_KHR_variable_pointers, Extension::kSPV_KHR_vulkan_memory_model, Extension::kSPV_KHR_workgroup_memory_explicit_layout, Extension::kSPV_NVX_multiview_per_view_attributes, Extension::kSPV_NV_bindless_texture, Extension::kSPV_NV_compute_shader_derivatives, Extension::kSPV_NV_cooperative_matrix, Extension::kSPV_NV_fragment_shader_barycentric, Extension::kSPV_NV_geometry_shader_passthrough, Extension::kSPV_NV_mesh_shader, Extension::kSPV_NV_ray_tracing, Extension::kSPV_NV_ray_tracing_motion_blur, Extension::kSPV_NV_sample_mask_override_coverage, Extension::kSPV_NV_shader_image_footprint, Extension::kSPV_NV_shader_sm_builtins, Extension::kSPV_NV_shader_subgroup_partitioned, Extension::kSPV_NV_shading_rate, Extension::kSPV_NV_stereo_view_rendering, Extension::kSPV_NV_viewport_array2, Extension::kSPV_VALIDATOR_ignore_type_decl_unique };
|
||||
const auto b = std::begin(known_ext_strs);
|
||||
const auto e = std::end(known_ext_strs);
|
||||
const auto found = std::equal_range(
|
||||
@@ -574,6 +576,8 @@ const char* CapabilityToString(SpvCapability capability) {
|
||||
return "FPGAClusterAttributesINTEL";
|
||||
case SpvCapabilityLoopFuseINTEL:
|
||||
return "LoopFuseINTEL";
|
||||
case SpvCapabilityMemoryAccessAliasingINTEL:
|
||||
return "MemoryAccessAliasingINTEL";
|
||||
case SpvCapabilityFPGABufferLocationINTEL:
|
||||
return "FPGABufferLocationINTEL";
|
||||
case SpvCapabilityArbitraryPrecisionFixedPointINTEL:
|
||||
|
||||
@@ -44,6 +44,7 @@ kSPV_INTEL_kernel_attributes,
|
||||
kSPV_INTEL_long_constant_composite,
|
||||
kSPV_INTEL_loop_fuse,
|
||||
kSPV_INTEL_media_block_io,
|
||||
kSPV_INTEL_memory_access_aliasing,
|
||||
kSPV_INTEL_optnone,
|
||||
kSPV_INTEL_shader_integer_functions2,
|
||||
kSPV_INTEL_subgroups,
|
||||
|
||||
@@ -60,6 +60,7 @@ static const SpvCapability pygen_variable_caps_KernelAttributesINTEL[] = {SpvCap
|
||||
static const SpvCapability pygen_variable_caps_Linkage[] = {SpvCapabilityLinkage};
|
||||
static const SpvCapability pygen_variable_caps_LoopFuseINTEL[] = {SpvCapabilityLoopFuseINTEL};
|
||||
static const SpvCapability pygen_variable_caps_Matrix[] = {SpvCapabilityMatrix};
|
||||
static const SpvCapability pygen_variable_caps_MemoryAccessAliasingINTEL[] = {SpvCapabilityMemoryAccessAliasingINTEL};
|
||||
static const SpvCapability pygen_variable_caps_MeshShadingNV[] = {SpvCapabilityMeshShadingNV};
|
||||
static const SpvCapability pygen_variable_caps_MinLod[] = {SpvCapabilityMinLod};
|
||||
static const SpvCapability pygen_variable_caps_MultiView[] = {SpvCapabilityMultiView};
|
||||
@@ -160,6 +161,7 @@ static const spvtools::Extension pygen_variable_exts_SPV_INTEL_kernel_attributes
|
||||
static const spvtools::Extension pygen_variable_exts_SPV_INTEL_long_constant_composite[] = {spvtools::Extension::kSPV_INTEL_long_constant_composite};
|
||||
static const spvtools::Extension pygen_variable_exts_SPV_INTEL_loop_fuse[] = {spvtools::Extension::kSPV_INTEL_loop_fuse};
|
||||
static const spvtools::Extension pygen_variable_exts_SPV_INTEL_media_block_io[] = {spvtools::Extension::kSPV_INTEL_media_block_io};
|
||||
static const spvtools::Extension pygen_variable_exts_SPV_INTEL_memory_access_aliasing[] = {spvtools::Extension::kSPV_INTEL_memory_access_aliasing};
|
||||
static const spvtools::Extension pygen_variable_exts_SPV_INTEL_optnone[] = {spvtools::Extension::kSPV_INTEL_optnone};
|
||||
static const spvtools::Extension pygen_variable_exts_SPV_INTEL_shader_integer_functions2[] = {spvtools::Extension::kSPV_INTEL_shader_integer_functions2};
|
||||
static const spvtools::Extension pygen_variable_exts_SPV_INTEL_subgroups[] = {spvtools::Extension::kSPV_INTEL_subgroups};
|
||||
@@ -315,7 +317,9 @@ static const spv_operand_desc_t pygen_variable_MemoryAccessEntries[] = {
|
||||
{"MakePointerVisible", 0x0010, 1, pygen_variable_caps_VulkanMemoryModel, 1, pygen_variable_exts_SPV_KHR_vulkan_memory_model, {SPV_OPERAND_TYPE_SCOPE_ID}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
|
||||
{"MakePointerVisibleKHR", 0x0010, 1, pygen_variable_caps_VulkanMemoryModel, 1, pygen_variable_exts_SPV_KHR_vulkan_memory_model, {SPV_OPERAND_TYPE_SCOPE_ID}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
|
||||
{"NonPrivatePointer", 0x0020, 1, pygen_variable_caps_VulkanMemoryModel, 1, pygen_variable_exts_SPV_KHR_vulkan_memory_model, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
|
||||
{"NonPrivatePointerKHR", 0x0020, 1, pygen_variable_caps_VulkanMemoryModel, 1, pygen_variable_exts_SPV_KHR_vulkan_memory_model, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu}
|
||||
{"NonPrivatePointerKHR", 0x0020, 1, pygen_variable_caps_VulkanMemoryModel, 1, pygen_variable_exts_SPV_KHR_vulkan_memory_model, {}, SPV_SPIRV_VERSION_WORD(1,5), 0xffffffffu},
|
||||
{"AliasScopeINTELMask", 0x10000, 1, pygen_variable_caps_MemoryAccessAliasingINTEL, 1, pygen_variable_exts_SPV_INTEL_memory_access_aliasing, {SPV_OPERAND_TYPE_ID}, 0xffffffffu, 0xffffffffu},
|
||||
{"NoAliasINTELMask", 0x20000, 1, pygen_variable_caps_MemoryAccessAliasingINTEL, 1, pygen_variable_exts_SPV_INTEL_memory_access_aliasing, {SPV_OPERAND_TYPE_ID}, 0xffffffffu, 0xffffffffu}
|
||||
};
|
||||
|
||||
static const spv_operand_desc_t pygen_variable_KernelProfilingInfoEntries[] = {
|
||||
@@ -770,6 +774,8 @@ static const spv_operand_desc_t pygen_variable_DecorationEntries[] = {
|
||||
{"PrefetchINTEL", 5902, 1, pygen_variable_caps_FPGAMemoryAccessesINTEL, 0, nullptr, {SPV_OPERAND_TYPE_LITERAL_INTEGER}, 0xffffffffu, 0xffffffffu},
|
||||
{"StallEnableINTEL", 5905, 1, pygen_variable_caps_FPGAClusterAttributesINTEL, 0, nullptr, {}, 0xffffffffu, 0xffffffffu},
|
||||
{"FuseLoopsInFunctionINTEL", 5907, 1, pygen_variable_caps_LoopFuseINTEL, 0, nullptr, {}, 0xffffffffu, 0xffffffffu},
|
||||
{"AliasScopeINTEL", 5914, 1, pygen_variable_caps_MemoryAccessAliasingINTEL, 0, nullptr, {SPV_OPERAND_TYPE_ID}, 0xffffffffu, 0xffffffffu},
|
||||
{"NoAliasINTEL", 5915, 1, pygen_variable_caps_MemoryAccessAliasingINTEL, 0, nullptr, {SPV_OPERAND_TYPE_ID}, 0xffffffffu, 0xffffffffu},
|
||||
{"BufferLocationINTEL", 5921, 1, pygen_variable_caps_FPGABufferLocationINTEL, 0, nullptr, {SPV_OPERAND_TYPE_LITERAL_INTEGER}, 0xffffffffu, 0xffffffffu},
|
||||
{"IOPipeStorageINTEL", 5944, 1, pygen_variable_caps_IOPipesINTEL, 0, nullptr, {SPV_OPERAND_TYPE_LITERAL_INTEGER}, 0xffffffffu, 0xffffffffu},
|
||||
{"FunctionFloatingPointModeINTEL", 6080, 1, pygen_variable_caps_FunctionFloatControlINTEL, 0, nullptr, {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_FPOPERATION_MODE}, 0xffffffffu, 0xffffffffu},
|
||||
@@ -1128,6 +1134,7 @@ static const spv_operand_desc_t pygen_variable_CapabilityEntries[] = {
|
||||
{"FPGAMemoryAccessesINTEL", 5898, 0, nullptr, 1, pygen_variable_exts_SPV_INTEL_fpga_memory_accesses, {}, 0xffffffffu, 0xffffffffu},
|
||||
{"FPGAClusterAttributesINTEL", 5904, 0, nullptr, 1, pygen_variable_exts_SPV_INTEL_fpga_cluster_attributes, {}, 0xffffffffu, 0xffffffffu},
|
||||
{"LoopFuseINTEL", 5906, 0, nullptr, 1, pygen_variable_exts_SPV_INTEL_loop_fuse, {}, 0xffffffffu, 0xffffffffu},
|
||||
{"MemoryAccessAliasingINTEL", 5910, 0, nullptr, 1, pygen_variable_exts_SPV_INTEL_memory_access_aliasing, {}, 0xffffffffu, 0xffffffffu},
|
||||
{"FPGABufferLocationINTEL", 5920, 0, nullptr, 1, pygen_variable_exts_SPV_INTEL_fpga_buffer_location, {}, 0xffffffffu, 0xffffffffu},
|
||||
{"ArbitraryPrecisionFixedPointINTEL", 5922, 0, nullptr, 1, pygen_variable_exts_SPV_INTEL_arbitrary_precision_fixed_point, {}, 0xffffffffu, 0xffffffffu},
|
||||
{"USMStorageClassesINTEL", 5935, 0, nullptr, 1, pygen_variable_exts_SPV_INTEL_usm_storage_classes, {}, 0xffffffffu, 0xffffffffu},
|
||||
|
||||
31
3rdparty/spirv-tools/source/diff/diff.cpp
vendored
31
3rdparty/spirv-tools/source/diff/diff.cpp
vendored
@@ -36,7 +36,7 @@ using InstructionToInstructionMap =
|
||||
// A flat list of instructions in a function for easier iteration.
|
||||
using InstructionList = std::vector<const opt::Instruction*>;
|
||||
// A map from a function to its list of instructions.
|
||||
using FunctionInstMap = std::unordered_map<uint32_t, InstructionList>;
|
||||
using FunctionInstMap = std::map<uint32_t, InstructionList>;
|
||||
// A list of ids with some similar property, for example functions with the same
|
||||
// name.
|
||||
using IdGroup = std::vector<uint32_t>;
|
||||
@@ -307,6 +307,7 @@ class Differ {
|
||||
const opt::Operand& dst_operand);
|
||||
bool DoInstructionsMatchFuzzy(const opt::Instruction* src_inst,
|
||||
const opt::Instruction* dst_inst);
|
||||
bool AreIdenticalUintConstants(uint32_t src_id, uint32_t dst_id);
|
||||
bool DoDebugAndAnnotationInstructionsMatch(const opt::Instruction* src_inst,
|
||||
const opt::Instruction* dst_inst);
|
||||
bool AreVariablesMatchable(uint32_t src_id, uint32_t dst_id,
|
||||
@@ -840,10 +841,8 @@ bool Differ::DoIdsMatchFuzzy(uint32_t src_id, uint32_t dst_id) {
|
||||
}
|
||||
|
||||
// Int and Uint constants are interchangeable, match them in that case.
|
||||
if (IsConstantUint(src_id_to_, src_id) &&
|
||||
IsConstantUint(dst_id_to_, dst_id)) {
|
||||
return GetConstantUint(src_id_to_, src_id) ==
|
||||
GetConstantUint(dst_id_to_, dst_id);
|
||||
if (AreIdenticalUintConstants(src_id, dst_id)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
@@ -911,6 +910,13 @@ bool Differ::DoInstructionsMatchFuzzy(const opt::Instruction* src_inst,
|
||||
return match;
|
||||
}
|
||||
|
||||
bool Differ::AreIdenticalUintConstants(uint32_t src_id, uint32_t dst_id) {
|
||||
return IsConstantUint(src_id_to_, src_id) &&
|
||||
IsConstantUint(dst_id_to_, dst_id) &&
|
||||
GetConstantUint(src_id_to_, src_id) ==
|
||||
GetConstantUint(dst_id_to_, dst_id);
|
||||
}
|
||||
|
||||
bool Differ::DoDebugAndAnnotationInstructionsMatch(
|
||||
const opt::Instruction* src_inst, const opt::Instruction* dst_inst) {
|
||||
if (src_inst->opcode() != dst_inst->opcode()) {
|
||||
@@ -1486,7 +1492,7 @@ float Differ::MatchFunctionBodies(const InstructionList& src_body,
|
||||
LongestCommonSubsequence<std::vector<const opt::Instruction*>> lcs(src_body,
|
||||
dst_body);
|
||||
|
||||
size_t best_match_length = lcs.Get<const opt::Instruction*>(
|
||||
uint32_t best_match_length = lcs.Get<const opt::Instruction*>(
|
||||
[this](const opt::Instruction* src_inst,
|
||||
const opt::Instruction* dst_inst) {
|
||||
return DoInstructionsMatchFuzzy(src_inst, dst_inst);
|
||||
@@ -2001,9 +2007,14 @@ void Differ::MatchTypeIds() {
|
||||
return false;
|
||||
}
|
||||
|
||||
return GetConstantUint(src_id_to_,
|
||||
src_inst->GetInOperand(1).AsId()) ==
|
||||
GetConstantUint(dst_id_to_, dst_inst->GetInOperand(1).AsId());
|
||||
if (AreIdenticalUintConstants(src_inst->GetInOperand(1).AsId(),
|
||||
dst_inst->GetInOperand(1).AsId())) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// If size is not OpConstant, expect the ids to match exactly (for
|
||||
// example if a spec contant is used).
|
||||
return DoOperandsMatch(src_inst, dst_inst, 1, 1);
|
||||
|
||||
case SpvOpTypeStruct:
|
||||
return MatchOpTypeStruct(src_inst, dst_inst, flexibility);
|
||||
@@ -2053,6 +2064,7 @@ void Differ::MatchConstants() {
|
||||
case SpvOpConstant:
|
||||
return MatchOpConstant(src_inst, dst_inst, flexibility);
|
||||
case SpvOpConstantComposite:
|
||||
case SpvOpSpecConstantComposite:
|
||||
// Composite constants must match in type and value.
|
||||
//
|
||||
// TODO: match OpConstantNull with OpConstantComposite with all zeros
|
||||
@@ -2081,7 +2093,6 @@ void Differ::MatchConstants() {
|
||||
case SpvOpSpecConstantTrue:
|
||||
case SpvOpSpecConstantFalse:
|
||||
case SpvOpSpecConstant:
|
||||
case SpvOpSpecConstantComposite:
|
||||
case SpvOpSpecConstantOp:
|
||||
// Match spec constants by name if available, then by the SpecId
|
||||
// decoration.
|
||||
|
||||
179
3rdparty/spirv-tools/source/diff/lcs.h
vendored
179
3rdparty/spirv-tools/source/diff/lcs.h
vendored
@@ -18,7 +18,9 @@
|
||||
#include <algorithm>
|
||||
#include <cassert>
|
||||
#include <cstddef>
|
||||
#include <cstdint>
|
||||
#include <functional>
|
||||
#include <stack>
|
||||
#include <vector>
|
||||
|
||||
namespace spvtools {
|
||||
@@ -43,44 +45,64 @@ class LongestCommonSubsequence {
|
||||
//
|
||||
// Returns the length of the longest common subsequence.
|
||||
template <typename T>
|
||||
size_t Get(std::function<bool(T src_elem, T dst_elem)> match,
|
||||
DiffMatch* src_match_result, DiffMatch* dst_match_result);
|
||||
uint32_t Get(std::function<bool(T src_elem, T dst_elem)> match,
|
||||
DiffMatch* src_match_result, DiffMatch* dst_match_result);
|
||||
|
||||
private:
|
||||
struct DiffMatchIndex {
|
||||
uint32_t src_offset;
|
||||
uint32_t dst_offset;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
size_t CalculateLCS(size_t src_start, size_t dst_start,
|
||||
std::function<bool(T src_elem, T dst_elem)> match);
|
||||
void CalculateLCS(std::function<bool(T src_elem, T dst_elem)> match);
|
||||
void RetrieveMatch(DiffMatch* src_match_result, DiffMatch* dst_match_result);
|
||||
bool IsInBound(size_t src_index, size_t dst_index) {
|
||||
return src_index < src_.size() && dst_index < dst_.size();
|
||||
bool IsInBound(DiffMatchIndex index) {
|
||||
return index.src_offset < src_.size() && index.dst_offset < dst_.size();
|
||||
}
|
||||
bool IsCalculated(size_t src_index, size_t dst_index) {
|
||||
assert(IsInBound(src_index, dst_index));
|
||||
return table_[src_index][dst_index].valid;
|
||||
bool IsCalculated(DiffMatchIndex index) {
|
||||
assert(IsInBound(index));
|
||||
return table_[index.src_offset][index.dst_offset].valid;
|
||||
}
|
||||
size_t GetMemoizedLength(size_t src_index, size_t dst_index) {
|
||||
if (!IsInBound(src_index, dst_index)) {
|
||||
bool IsCalculatedOrOutOfBound(DiffMatchIndex index) {
|
||||
return !IsInBound(index) || IsCalculated(index);
|
||||
}
|
||||
uint32_t GetMemoizedLength(DiffMatchIndex index) {
|
||||
if (!IsInBound(index)) {
|
||||
return 0;
|
||||
}
|
||||
assert(IsCalculated(src_index, dst_index));
|
||||
return table_[src_index][dst_index].best_match_length;
|
||||
assert(IsCalculated(index));
|
||||
return table_[index.src_offset][index.dst_offset].best_match_length;
|
||||
}
|
||||
bool IsMatched(size_t src_index, size_t dst_index) {
|
||||
assert(IsCalculated(src_index, dst_index));
|
||||
return table_[src_index][dst_index].matched;
|
||||
bool IsMatched(DiffMatchIndex index) {
|
||||
assert(IsCalculated(index));
|
||||
return table_[index.src_offset][index.dst_offset].matched;
|
||||
}
|
||||
void MarkMatched(DiffMatchIndex index, uint32_t best_match_length,
|
||||
bool matched) {
|
||||
assert(IsInBound(index));
|
||||
DiffMatchEntry& entry = table_[index.src_offset][index.dst_offset];
|
||||
assert(!entry.valid);
|
||||
|
||||
entry.best_match_length = best_match_length & 0x3FFFFFFF;
|
||||
assert(entry.best_match_length == best_match_length);
|
||||
entry.matched = matched;
|
||||
entry.valid = true;
|
||||
}
|
||||
|
||||
const Sequence& src_;
|
||||
const Sequence& dst_;
|
||||
|
||||
struct DiffMatchEntry {
|
||||
size_t best_match_length = 0;
|
||||
DiffMatchEntry() : best_match_length(0), matched(false), valid(false) {}
|
||||
|
||||
uint32_t best_match_length : 30;
|
||||
// Whether src[i] and dst[j] matched. This is an optimization to avoid
|
||||
// calling the `match` function again when walking the LCS table.
|
||||
bool matched = false;
|
||||
uint32_t matched : 1;
|
||||
// Use for the recursive algorithm to know if the contents of this entry are
|
||||
// valid.
|
||||
bool valid = false;
|
||||
uint32_t valid : 1;
|
||||
};
|
||||
|
||||
std::vector<std::vector<DiffMatchEntry>> table_;
|
||||
@@ -88,18 +110,17 @@ class LongestCommonSubsequence {
|
||||
|
||||
template <typename Sequence>
|
||||
template <typename T>
|
||||
size_t LongestCommonSubsequence<Sequence>::Get(
|
||||
uint32_t LongestCommonSubsequence<Sequence>::Get(
|
||||
std::function<bool(T src_elem, T dst_elem)> match,
|
||||
DiffMatch* src_match_result, DiffMatch* dst_match_result) {
|
||||
size_t best_match_length = CalculateLCS(0, 0, match);
|
||||
CalculateLCS(match);
|
||||
RetrieveMatch(src_match_result, dst_match_result);
|
||||
return best_match_length;
|
||||
return GetMemoizedLength({0, 0});
|
||||
}
|
||||
|
||||
template <typename Sequence>
|
||||
template <typename T>
|
||||
size_t LongestCommonSubsequence<Sequence>::CalculateLCS(
|
||||
size_t src_start, size_t dst_start,
|
||||
void LongestCommonSubsequence<Sequence>::CalculateLCS(
|
||||
std::function<bool(T src_elem, T dst_elem)> match) {
|
||||
// The LCS algorithm is simple. Given sequences s and d, with a:b depicting a
|
||||
// range in python syntax:
|
||||
@@ -113,53 +134,62 @@ size_t LongestCommonSubsequence<Sequence>::CalculateLCS(
|
||||
//
|
||||
// This is a recursive function with memoization, which avoids filling table
|
||||
// entries where unnecessary. This makes the best case O(N) instead of
|
||||
// O(N^2).
|
||||
// O(N^2). The implemention uses a std::stack to avoid stack overflow on long
|
||||
// sequences.
|
||||
|
||||
// To avoid unnecessary recursion on long sequences, process a whole strip of
|
||||
// matching elements in one go.
|
||||
size_t src_cur = src_start;
|
||||
size_t dst_cur = dst_start;
|
||||
while (IsInBound(src_cur, dst_cur) && !IsCalculated(src_cur, dst_cur) &&
|
||||
match(src_[src_cur], dst_[dst_cur])) {
|
||||
++src_cur;
|
||||
++dst_cur;
|
||||
if (src_.empty() || dst_.empty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
// We've reached a pair of elements that don't match. Recursively determine
|
||||
// which one should be left unmatched.
|
||||
size_t best_match_length = 0;
|
||||
if (IsInBound(src_cur, dst_cur)) {
|
||||
if (IsCalculated(src_cur, dst_cur)) {
|
||||
best_match_length = GetMemoizedLength(src_cur, dst_cur);
|
||||
} else {
|
||||
best_match_length = std::max(CalculateLCS(src_cur + 1, dst_cur, match),
|
||||
CalculateLCS(src_cur, dst_cur + 1, match));
|
||||
std::stack<DiffMatchIndex> to_calculate;
|
||||
to_calculate.push({0, 0});
|
||||
|
||||
// Fill the table with this information
|
||||
DiffMatchEntry& entry = table_[src_cur][dst_cur];
|
||||
assert(!entry.valid);
|
||||
entry.best_match_length = best_match_length;
|
||||
entry.valid = true;
|
||||
while (!to_calculate.empty()) {
|
||||
DiffMatchIndex current = to_calculate.top();
|
||||
to_calculate.pop();
|
||||
assert(IsInBound(current));
|
||||
|
||||
// If already calculated through another path, ignore it.
|
||||
if (IsCalculated(current)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (match(src_[current.src_offset], dst_[current.dst_offset])) {
|
||||
// If the current elements match, advance both indices and calculate the
|
||||
// LCS if not already. Visit `current` again afterwards, so its
|
||||
// corresponding entry will be updated.
|
||||
DiffMatchIndex next = {current.src_offset + 1, current.dst_offset + 1};
|
||||
if (IsCalculatedOrOutOfBound(next)) {
|
||||
MarkMatched(current, GetMemoizedLength(next) + 1, true);
|
||||
} else {
|
||||
to_calculate.push(current);
|
||||
to_calculate.push(next);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
// We've reached a pair of elements that don't match. Calculate the LCS for
|
||||
// both cases of either being left unmatched and take the max. Visit
|
||||
// `current` again afterwards, so its corresponding entry will be updated.
|
||||
DiffMatchIndex next_src = {current.src_offset + 1, current.dst_offset};
|
||||
DiffMatchIndex next_dst = {current.src_offset, current.dst_offset + 1};
|
||||
|
||||
if (IsCalculatedOrOutOfBound(next_src) &&
|
||||
IsCalculatedOrOutOfBound(next_dst)) {
|
||||
uint32_t best_match_length =
|
||||
std::max(GetMemoizedLength(next_src), GetMemoizedLength(next_dst));
|
||||
MarkMatched(current, best_match_length, false);
|
||||
continue;
|
||||
}
|
||||
|
||||
to_calculate.push(current);
|
||||
if (!IsCalculatedOrOutOfBound(next_src)) {
|
||||
to_calculate.push(next_src);
|
||||
}
|
||||
if (!IsCalculatedOrOutOfBound(next_dst)) {
|
||||
to_calculate.push(next_dst);
|
||||
}
|
||||
}
|
||||
|
||||
// Go over the matched strip and update the table as well.
|
||||
assert(src_cur - src_start == dst_cur - dst_start);
|
||||
size_t contiguous_match_len = src_cur - src_start;
|
||||
|
||||
for (size_t i = 0; i < contiguous_match_len; ++i) {
|
||||
--src_cur;
|
||||
--dst_cur;
|
||||
assert(IsInBound(src_cur, dst_cur));
|
||||
|
||||
DiffMatchEntry& entry = table_[src_cur][dst_cur];
|
||||
assert(!entry.valid);
|
||||
entry.best_match_length = ++best_match_length;
|
||||
entry.matched = true;
|
||||
entry.valid = true;
|
||||
}
|
||||
|
||||
return best_match_length;
|
||||
}
|
||||
|
||||
template <typename Sequence>
|
||||
@@ -171,20 +201,19 @@ void LongestCommonSubsequence<Sequence>::RetrieveMatch(
|
||||
src_match_result->resize(src_.size(), false);
|
||||
dst_match_result->resize(dst_.size(), false);
|
||||
|
||||
size_t src_cur = 0;
|
||||
size_t dst_cur = 0;
|
||||
while (IsInBound(src_cur, dst_cur)) {
|
||||
if (IsMatched(src_cur, dst_cur)) {
|
||||
(*src_match_result)[src_cur++] = true;
|
||||
(*dst_match_result)[dst_cur++] = true;
|
||||
DiffMatchIndex current = {0, 0};
|
||||
while (IsInBound(current)) {
|
||||
if (IsMatched(current)) {
|
||||
(*src_match_result)[current.src_offset++] = true;
|
||||
(*dst_match_result)[current.dst_offset++] = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (GetMemoizedLength(src_cur + 1, dst_cur) >=
|
||||
GetMemoizedLength(src_cur, dst_cur + 1)) {
|
||||
++src_cur;
|
||||
if (GetMemoizedLength({current.src_offset + 1, current.dst_offset}) >=
|
||||
GetMemoizedLength({current.src_offset, current.dst_offset + 1})) {
|
||||
++current.src_offset;
|
||||
} else {
|
||||
++dst_cur;
|
||||
++current.dst_offset;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
3
3rdparty/spirv-tools/source/opcode.cpp
vendored
3
3rdparty/spirv-tools/source/opcode.cpp
vendored
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2015-2020 The Khronos Group Inc.
|
||||
// Copyright (c) 2015-2022 The Khronos Group Inc.
|
||||
// Modifications Copyright (C) 2020 Advanced Micro Devices, Inc. All rights
|
||||
// reserved.
|
||||
//
|
||||
@@ -631,6 +631,7 @@ bool spvOpcodeIsDebug(SpvOp opcode) {
|
||||
case SpvOpString:
|
||||
case SpvOpLine:
|
||||
case SpvOpNoLine:
|
||||
case SpvOpModuleProcessed:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
|
||||
@@ -158,6 +158,7 @@ Type* ConstantManager::GetType(const Instruction* inst) const {
|
||||
std::vector<const Constant*> ConstantManager::GetOperandConstants(
|
||||
const Instruction* inst) const {
|
||||
std::vector<const Constant*> constants;
|
||||
constants.reserve(inst->NumInOperands());
|
||||
for (uint32_t i = 0; i < inst->NumInOperands(); i++) {
|
||||
const Operand* operand = &inst->GetInOperand(i);
|
||||
if (operand->type != SPV_OPERAND_TYPE_ID) {
|
||||
|
||||
@@ -745,11 +745,11 @@ void CopyPropagateArrays::UpdateUses(Instruction* original_ptr_inst,
|
||||
context()->AnalyzeUses(use);
|
||||
}
|
||||
break;
|
||||
case SpvOpDecorate:
|
||||
// We treat an OpImageTexelPointer as a load. The result type should
|
||||
// always have the Image storage class, and should not need to be
|
||||
// updated.
|
||||
case SpvOpImageTexelPointer:
|
||||
// We treat an OpImageTexelPointer as a load. The result type should
|
||||
// always have the Image storage class, and should not need to be
|
||||
// updated.
|
||||
|
||||
// Replace the actual use.
|
||||
context()->ForgetUses(use);
|
||||
use->SetOperand(index, {new_ptr_inst->result_id()});
|
||||
|
||||
@@ -35,7 +35,7 @@ namespace opt {
|
||||
//
|
||||
// The hard part is keeping all of the types correct. We do not want to
|
||||
// have to do too large a search to update everything, which may not be
|
||||
// possible, do we give up if we see any instruction that might be hard to
|
||||
// possible, so we give up if we see any instruction that might be hard to
|
||||
// update.
|
||||
|
||||
class CopyPropagateArrays : public MemPass {
|
||||
|
||||
10
3rdparty/spirv-tools/source/opt/instruction.cpp
vendored
10
3rdparty/spirv-tools/source/opt/instruction.cpp
vendored
@@ -76,10 +76,9 @@ Instruction::Instruction(IRContext* c, const spv_parsed_instruction_t& inst,
|
||||
dbg_scope_(kNoDebugScope, kNoInlinedAt) {
|
||||
for (uint32_t i = 0; i < inst.num_operands; ++i) {
|
||||
const auto& current_payload = inst.operands[i];
|
||||
std::vector<uint32_t> words(
|
||||
inst.words + current_payload.offset,
|
||||
operands_.emplace_back(
|
||||
current_payload.type, inst.words + current_payload.offset,
|
||||
inst.words + current_payload.offset + current_payload.num_words);
|
||||
operands_.emplace_back(current_payload.type, std::move(words));
|
||||
}
|
||||
assert((!IsLineInst() || dbg_line.empty()) &&
|
||||
"Op(No)Line attaching to Op(No)Line found");
|
||||
@@ -96,10 +95,9 @@ Instruction::Instruction(IRContext* c, const spv_parsed_instruction_t& inst,
|
||||
dbg_scope_(dbg_scope) {
|
||||
for (uint32_t i = 0; i < inst.num_operands; ++i) {
|
||||
const auto& current_payload = inst.operands[i];
|
||||
std::vector<uint32_t> words(
|
||||
inst.words + current_payload.offset,
|
||||
operands_.emplace_back(
|
||||
current_payload.type, inst.words + current_payload.offset,
|
||||
inst.words + current_payload.offset + current_payload.num_words);
|
||||
operands_.emplace_back(current_payload.type, std::move(words));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -84,6 +84,11 @@ struct Operand {
|
||||
|
||||
Operand(spv_operand_type_t t, const OperandData& w) : type(t), words(w) {}
|
||||
|
||||
template <class InputIt>
|
||||
Operand(spv_operand_type_t t, InputIt firstOperandData,
|
||||
InputIt lastOperandData)
|
||||
: type(t), words(firstOperandData, lastOperandData) {}
|
||||
|
||||
spv_operand_type_t type; // Type of this logical operand.
|
||||
OperandData words; // Binary segments of this logical operand.
|
||||
|
||||
|
||||
@@ -253,8 +253,12 @@ void ReplaceDescArrayAccessUsingVarIndex::ReplaceNonUniformAccessWithSwitchCase(
|
||||
Instruction* access_chain_final_user, Instruction* access_chain,
|
||||
uint32_t number_of_elements,
|
||||
const std::deque<Instruction*>& insts_to_be_cloned) const {
|
||||
// Create merge block and add terminator
|
||||
auto* block = context()->get_instr_block(access_chain_final_user);
|
||||
// If the instruction does not belong to a block (i.e. in the case of
|
||||
// OpDecorate), no replacement is needed.
|
||||
if (!block) return;
|
||||
|
||||
// Create merge block and add terminator
|
||||
auto* merge_block = SeparateInstructionsIntoNewBlock(
|
||||
block, access_chain_final_user->NextNode());
|
||||
|
||||
|
||||
@@ -64,6 +64,11 @@ class SmallVector {
|
||||
}
|
||||
}
|
||||
|
||||
template <class InputIt>
|
||||
SmallVector(InputIt first, InputIt last) : SmallVector() {
|
||||
insert(end(), first, last);
|
||||
}
|
||||
|
||||
SmallVector(std::vector<T>&& vec) : SmallVector() {
|
||||
if (vec.size() > small_size) {
|
||||
large_data_ = MakeUnique<std::vector<T>>(std::move(vec));
|
||||
|
||||
@@ -2804,8 +2804,9 @@ spv_result_t ValidateExtInst(ValidationState_t& _, const Instruction* inst) {
|
||||
bool invalid = false;
|
||||
auto* component_count = _.FindDef(inst->word(i));
|
||||
if (IsConstIntScalarTypeWith32Or64Bits(_, component_count)) {
|
||||
// TODO: We need a spec discussion for the bindless array.
|
||||
if (!component_count->word(3)) {
|
||||
// TODO: We need a spec discussion for the runtime array for
|
||||
// OpenCL.
|
||||
if (!vulkanDebugInfo && !component_count->word(3)) {
|
||||
invalid = true;
|
||||
}
|
||||
} else if (component_count->words().size() > 6 &&
|
||||
|
||||
Reference in New Issue
Block a user