mirror of https://github.com/bkaradzic/bgfx
Updated spirv-tools.
This commit is contained in:
parent
0403cae25e
commit
e0d515c57a
|
@ -1 +1 @@
|
|||
"v2022.4-dev", "SPIRV-Tools v2022.4-dev 9af8fde5414723dfc630c20d733548f881e4804a"
|
||||
"v2022.5-dev", "SPIRV-Tools v2022.5-dev 01f246880b501c751d62ad543d886e08bfa756b5"
|
||||
|
|
|
@ -36,6 +36,8 @@ const char* ExtensionToString(Extension extension) {
|
|||
return "SPV_EXT_fragment_shader_interlock";
|
||||
case Extension::kSPV_EXT_mesh_shader:
|
||||
return "SPV_EXT_mesh_shader";
|
||||
case Extension::kSPV_EXT_opacity_micromap:
|
||||
return "SPV_EXT_opacity_micromap";
|
||||
case Extension::kSPV_EXT_physical_storage_buffer:
|
||||
return "SPV_EXT_physical_storage_buffer";
|
||||
case Extension::kSPV_EXT_shader_atomic_float16_add:
|
||||
|
@ -219,8 +221,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_early_and_late_fragment_tests", "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_ARM_core_builtins", "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_mesh_shader", "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_split_barrier", "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_cull_mask", "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_rotate", "SPV_KHR_subgroup_uniform_control_flow", "SPV_KHR_subgroup_vote", "SPV_KHR_terminate_invocation", "SPV_KHR_uniform_group_instructions", "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_early_and_late_fragment_tests, 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_ARM_core_builtins, 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_mesh_shader, 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_split_barrier, 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_cull_mask, 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_rotate, Extension::kSPV_KHR_subgroup_uniform_control_flow, Extension::kSPV_KHR_subgroup_vote, Extension::kSPV_KHR_terminate_invocation, Extension::kSPV_KHR_uniform_group_instructions, 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_early_and_late_fragment_tests", "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_ARM_core_builtins", "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_mesh_shader", "SPV_EXT_opacity_micromap", "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_split_barrier", "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_cull_mask", "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_rotate", "SPV_KHR_subgroup_uniform_control_flow", "SPV_KHR_subgroup_vote", "SPV_KHR_terminate_invocation", "SPV_KHR_uniform_group_instructions", "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_early_and_late_fragment_tests, 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_ARM_core_builtins, 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_mesh_shader, Extension::kSPV_EXT_opacity_micromap, 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_split_barrier, 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_cull_mask, 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_rotate, Extension::kSPV_KHR_subgroup_uniform_control_flow, Extension::kSPV_KHR_subgroup_vote, Extension::kSPV_KHR_terminate_invocation, Extension::kSPV_KHR_uniform_group_instructions, 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(
|
||||
|
@ -528,6 +530,8 @@ const char* CapabilityToString(SpvCapability capability) {
|
|||
return "FragmentShaderPixelInterlockEXT";
|
||||
case SpvCapabilityDemoteToHelperInvocation:
|
||||
return "DemoteToHelperInvocation";
|
||||
case SpvCapabilityRayTracingOpacityMicromapEXT:
|
||||
return "RayTracingOpacityMicromapEXT";
|
||||
case SpvCapabilityBindlessTextureNV:
|
||||
return "BindlessTextureNV";
|
||||
case SpvCapabilitySubgroupShuffleINTEL:
|
||||
|
|
|
@ -16,6 +16,7 @@ kSPV_EXT_fragment_fully_covered,
|
|||
kSPV_EXT_fragment_invocation_density,
|
||||
kSPV_EXT_fragment_shader_interlock,
|
||||
kSPV_EXT_mesh_shader,
|
||||
kSPV_EXT_opacity_micromap,
|
||||
kSPV_EXT_physical_storage_buffer,
|
||||
kSPV_EXT_shader_atomic_float16_add,
|
||||
kSPV_EXT_shader_atomic_float_add,
|
||||
|
|
|
@ -32,4 +32,5 @@
|
|||
{31, "Google", "Skia SkSL", "Google Skia SkSL"},
|
||||
{32, "TornadoVM", "SPIRV Beehive Toolkit", "TornadoVM SPIRV Beehive Toolkit"},
|
||||
{33, "DragonJoker", "ShaderWriter", "DragonJoker ShaderWriter"},
|
||||
{34, "Rayan Hatout", "SPIRVSmith", "Rayan Hatout SPIRVSmith"},
|
||||
{34, "Rayan Hatout", "SPIRVSmith", "Rayan Hatout SPIRVSmith"},
|
||||
{35, "Saarland University", "Shady", "Saarland University Shady"},
|
|
@ -33,5 +33,7 @@ static const spv_ext_inst_desc_t nonsemantic_clspvreflection_entries[] = {
|
|||
{"ImageArgumentInfoChannelOrderPushConstant", 30, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}},
|
||||
{"ImageArgumentInfoChannelDataTypePushConstant", 31, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}},
|
||||
{"ImageArgumentInfoChannelOrderUniform", 32, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}},
|
||||
{"ImageArgumentInfoChannelDataTypeUniform", 33, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}
|
||||
{"ImageArgumentInfoChannelDataTypeUniform", 33, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}},
|
||||
{"ArgumentStorageTexelBuffer", 34, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_OPTIONAL_ID, SPV_OPERAND_TYPE_NONE}},
|
||||
{"ArgumentUniformTexelBuffer", 35, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_OPTIONAL_ID, SPV_OPERAND_TYPE_NONE}}
|
||||
};
|
|
@ -80,6 +80,7 @@ static const SpvCapability pygen_variable_caps_RayTracingKHR[] = {SpvCapabilityR
|
|||
static const SpvCapability pygen_variable_caps_RayTracingMotionBlurNV[] = {SpvCapabilityRayTracingMotionBlurNV};
|
||||
static const SpvCapability pygen_variable_caps_RayTracingNV[] = {SpvCapabilityRayTracingNV};
|
||||
static const SpvCapability pygen_variable_caps_RayTracingNVRayTracingKHR[] = {SpvCapabilityRayTracingNV, SpvCapabilityRayTracingKHR};
|
||||
static const SpvCapability pygen_variable_caps_RayTracingOpacityMicromapEXT[] = {SpvCapabilityRayTracingOpacityMicromapEXT};
|
||||
static const SpvCapability pygen_variable_caps_RayTraversalPrimitiveCullingKHR[] = {SpvCapabilityRayTraversalPrimitiveCullingKHR};
|
||||
static const SpvCapability pygen_variable_caps_RoundToInfinityINTEL[] = {SpvCapabilityRoundToInfinityINTEL};
|
||||
static const SpvCapability pygen_variable_caps_RoundingModeRTE[] = {SpvCapabilityRoundingModeRTE};
|
||||
|
@ -141,6 +142,7 @@ static const spvtools::Extension pygen_variable_exts_SPV_EXT_fragment_shader_int
|
|||
static const spvtools::Extension pygen_variable_exts_SPV_EXT_mesh_shader[] = {spvtools::Extension::kSPV_EXT_mesh_shader};
|
||||
static const spvtools::Extension pygen_variable_exts_SPV_EXT_mesh_shaderSPV_KHR_shader_draw_parametersSPV_NV_mesh_shader[] = {spvtools::Extension::kSPV_EXT_mesh_shader, spvtools::Extension::kSPV_KHR_shader_draw_parameters, spvtools::Extension::kSPV_NV_mesh_shader};
|
||||
static const spvtools::Extension pygen_variable_exts_SPV_EXT_mesh_shaderSPV_NV_mesh_shader[] = {spvtools::Extension::kSPV_EXT_mesh_shader, spvtools::Extension::kSPV_NV_mesh_shader};
|
||||
static const spvtools::Extension pygen_variable_exts_SPV_EXT_opacity_micromap[] = {spvtools::Extension::kSPV_EXT_opacity_micromap};
|
||||
static const spvtools::Extension pygen_variable_exts_SPV_EXT_physical_storage_bufferSPV_KHR_physical_storage_buffer[] = {spvtools::Extension::kSPV_EXT_physical_storage_buffer, spvtools::Extension::kSPV_KHR_physical_storage_buffer};
|
||||
static const spvtools::Extension pygen_variable_exts_SPV_EXT_shader_atomic_float16_add[] = {spvtools::Extension::kSPV_EXT_shader_atomic_float16_add};
|
||||
static const spvtools::Extension pygen_variable_exts_SPV_EXT_shader_atomic_float_add[] = {spvtools::Extension::kSPV_EXT_shader_atomic_float_add};
|
||||
|
@ -351,7 +353,8 @@ static const spv_operand_desc_t pygen_variable_RayFlagsEntries[] = {
|
|||
{"CullOpaqueKHR", 0x0040, 2, pygen_variable_caps_RayQueryKHRRayTracingKHR, 0, nullptr, {}, 0xffffffffu, 0xffffffffu},
|
||||
{"CullNoOpaqueKHR", 0x0080, 2, pygen_variable_caps_RayQueryKHRRayTracingKHR, 0, nullptr, {}, 0xffffffffu, 0xffffffffu},
|
||||
{"SkipTrianglesKHR", 0x0100, 1, pygen_variable_caps_RayTraversalPrimitiveCullingKHR, 0, nullptr, {}, 0xffffffffu, 0xffffffffu},
|
||||
{"SkipAABBsKHR", 0x0200, 1, pygen_variable_caps_RayTraversalPrimitiveCullingKHR, 0, nullptr, {}, 0xffffffffu, 0xffffffffu}
|
||||
{"SkipAABBsKHR", 0x0200, 1, pygen_variable_caps_RayTraversalPrimitiveCullingKHR, 0, nullptr, {}, 0xffffffffu, 0xffffffffu},
|
||||
{"ForceOpacityMicromap2StateEXT", 0x0400, 1, pygen_variable_caps_RayTracingOpacityMicromapEXT, 0, nullptr, {}, 0xffffffffu, 0xffffffffu}
|
||||
};
|
||||
|
||||
static const spv_operand_desc_t pygen_variable_FragmentShadingRateEntries[] = {
|
||||
|
@ -1142,6 +1145,7 @@ static const spv_operand_desc_t pygen_variable_CapabilityEntries[] = {
|
|||
{"FragmentShaderPixelInterlockEXT", 5378, 1, pygen_variable_caps_Shader, 1, pygen_variable_exts_SPV_EXT_fragment_shader_interlock, {}, 0xffffffffu, 0xffffffffu},
|
||||
{"DemoteToHelperInvocation", 5379, 1, pygen_variable_caps_Shader, 1, pygen_variable_exts_SPV_EXT_demote_to_helper_invocation, {}, SPV_SPIRV_VERSION_WORD(1,6), 0xffffffffu},
|
||||
{"DemoteToHelperInvocationEXT", 5379, 1, pygen_variable_caps_Shader, 1, pygen_variable_exts_SPV_EXT_demote_to_helper_invocation, {}, SPV_SPIRV_VERSION_WORD(1,6), 0xffffffffu},
|
||||
{"RayTracingOpacityMicromapEXT", 5381, 2, pygen_variable_caps_RayQueryKHRRayTracingKHR, 1, pygen_variable_exts_SPV_EXT_opacity_micromap, {}, 0xffffffffu, 0xffffffffu},
|
||||
{"BindlessTextureNV", 5390, 0, nullptr, 1, pygen_variable_exts_SPV_NV_bindless_texture, {}, 0xffffffffu, 0xffffffffu},
|
||||
{"SubgroupShuffleINTEL", 5568, 0, nullptr, 1, pygen_variable_exts_SPV_INTEL_subgroups, {}, 0xffffffffu, 0xffffffffu},
|
||||
{"SubgroupBufferBlockIOINTEL", 5569, 0, nullptr, 1, pygen_variable_exts_SPV_INTEL_subgroups, {}, 0xffffffffu, 0xffffffffu},
|
||||
|
|
|
@ -275,10 +275,16 @@ std::vector<std::pair<BB*, BB*>> CFA<BB>::CalculateDominators(
|
|||
|
||||
std::vector<std::pair<bb_ptr, bb_ptr>> out;
|
||||
for (auto idom : idoms) {
|
||||
// At this point if there is no dominator for the node, just make it
|
||||
// reflexive.
|
||||
auto dominator = std::get<1>(idom).dominator;
|
||||
if (dominator == undefined_dom) {
|
||||
dominator = std::get<1>(idom).postorder_index;
|
||||
}
|
||||
// NOTE: performing a const cast for convenient usage with
|
||||
// UpdateImmediateDominators
|
||||
out.push_back({const_cast<BB*>(std::get<0>(idom)),
|
||||
const_cast<BB*>(postorder[std::get<1>(idom).dominator])});
|
||||
const_cast<BB*>(postorder[dominator])});
|
||||
}
|
||||
|
||||
// Sort by postorder index to generate a deterministic ordering of edges.
|
||||
|
|
|
@ -125,6 +125,26 @@ bool CanMergeWithSuccessor(IRContext* context, BasicBlock* block) {
|
|||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (succ_is_merge || IsContinue(context, lab_id)) {
|
||||
auto* struct_cfg = context->GetStructuredCFGAnalysis();
|
||||
auto switch_block_id = struct_cfg->ContainingSwitch(block->id());
|
||||
if (switch_block_id) {
|
||||
auto switch_merge_id = struct_cfg->SwitchMergeBlock(switch_block_id);
|
||||
const auto* switch_inst =
|
||||
&*block->GetParent()->FindBlock(switch_block_id)->tail();
|
||||
for (uint32_t i = 1; i < switch_inst->NumInOperands(); i += 2) {
|
||||
auto target_id = switch_inst->GetSingleWordInOperand(i);
|
||||
if (target_id == block->id() && target_id != switch_merge_id) {
|
||||
// Case constructs must be structurally dominated by the OpSwitch.
|
||||
// Since the successor is the merge/continue for another construct,
|
||||
// merging the blocks would break that requirement.
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -163,6 +163,21 @@ class ScalarConstant : public Constant {
|
|||
return is_zero;
|
||||
}
|
||||
|
||||
uint32_t GetU32BitValue() const {
|
||||
// Relies on unsigned values smaller than 32-bit being zero extended. See
|
||||
// section 2.2.1 of the SPIR-V spec.
|
||||
assert(words().size() == 1);
|
||||
return words()[0];
|
||||
}
|
||||
|
||||
uint64_t GetU64BitValue() const {
|
||||
// Relies on unsigned values smaller than 64-bit being zero extended. See
|
||||
// section 2.2.1 of the SPIR-V spec.
|
||||
assert(words().size() == 2);
|
||||
return static_cast<uint64_t>(words()[1]) << 32 |
|
||||
static_cast<uint64_t>(words()[0]);
|
||||
}
|
||||
|
||||
protected:
|
||||
ScalarConstant(const Type* ty, const std::vector<uint32_t>& w)
|
||||
: Constant(ty), words_(w) {}
|
||||
|
@ -189,13 +204,6 @@ class IntConstant : public ScalarConstant {
|
|||
return words()[0];
|
||||
}
|
||||
|
||||
uint32_t GetU32BitValue() const {
|
||||
// Relies on unsigned values smaller than 32-bit being zero extended. See
|
||||
// section 2.2.1 of the SPIR-V spec.
|
||||
assert(words().size() == 1);
|
||||
return words()[0];
|
||||
}
|
||||
|
||||
int64_t GetS64BitValue() const {
|
||||
// Relies on unsigned values smaller than 64-bit being sign extended. See
|
||||
// section 2.2.1 of the SPIR-V spec.
|
||||
|
@ -204,14 +212,6 @@ class IntConstant : public ScalarConstant {
|
|||
static_cast<uint64_t>(words()[0]);
|
||||
}
|
||||
|
||||
uint64_t GetU64BitValue() const {
|
||||
// Relies on unsigned values smaller than 64-bit being zero extended. See
|
||||
// section 2.2.1 of the SPIR-V spec.
|
||||
assert(words().size() == 2);
|
||||
return static_cast<uint64_t>(words()[1]) << 32 |
|
||||
static_cast<uint64_t>(words()[0]);
|
||||
}
|
||||
|
||||
// Make a copy of this IntConstant instance.
|
||||
std::unique_ptr<IntConstant> CopyIntConstant() const {
|
||||
return MakeUnique<IntConstant>(type_->AsInteger(), words_);
|
||||
|
|
|
@ -136,25 +136,28 @@ std::vector<uint32_t> GetWordsFromScalarIntConstant(
|
|||
const analysis::IntConstant* c) {
|
||||
assert(c != nullptr);
|
||||
uint32_t width = c->type()->AsInteger()->width();
|
||||
assert(width == 32 || width == 64);
|
||||
assert(width == 8 || width == 16 || width == 32 || width == 64);
|
||||
if (width == 64) {
|
||||
uint64_t uval = static_cast<uint64_t>(c->GetU64());
|
||||
return ExtractInts(uval);
|
||||
}
|
||||
return {c->GetU32()};
|
||||
// Section 2.2.1 of the SPIR-V spec guarantees that all integer types
|
||||
// smaller than 32-bits are automatically zero or sign extended to 32-bits.
|
||||
return {c->GetU32BitValue()};
|
||||
}
|
||||
|
||||
std::vector<uint32_t> GetWordsFromScalarFloatConstant(
|
||||
const analysis::FloatConstant* c) {
|
||||
assert(c != nullptr);
|
||||
uint32_t width = c->type()->AsFloat()->width();
|
||||
assert(width == 32 || width == 64);
|
||||
assert(width == 16 || width == 32 || width == 64);
|
||||
if (width == 64) {
|
||||
utils::FloatProxy<double> result(c->GetDouble());
|
||||
return result.GetWords();
|
||||
}
|
||||
utils::FloatProxy<float> result(c->GetFloat());
|
||||
return result.GetWords();
|
||||
// Section 2.2.1 of the SPIR-V spec guarantees that all floating-point types
|
||||
// smaller than 32-bits are automatically zero extended to 32-bits.
|
||||
return {c->GetU32BitValue()};
|
||||
}
|
||||
|
||||
std::vector<uint32_t> GetWordsFromNumericScalarOrVectorConstant(
|
||||
|
|
|
@ -333,7 +333,7 @@ class BuiltInsValidator {
|
|||
// Used for GlobalInvocationId, LocalInvocationId, NumWorkgroups, WorkgroupId.
|
||||
spv_result_t ValidateComputeShaderI32Vec3InputAtDefinition(
|
||||
const Decoration& decoration, const Instruction& inst);
|
||||
spv_result_t ValidateSMBuiltinsAtDefinition(const Decoration& decoration,
|
||||
spv_result_t ValidateNVSMOrARMCoreBuiltinsAtDefinition(const Decoration& decoration,
|
||||
const Instruction& inst);
|
||||
// Used for BaryCoord, BaryCoordNoPersp.
|
||||
spv_result_t ValidateFragmentShaderF32Vec3InputAtDefinition(
|
||||
|
@ -528,7 +528,7 @@ class BuiltInsValidator {
|
|||
const Instruction& referenced_inst,
|
||||
const Instruction& referenced_from_inst);
|
||||
|
||||
spv_result_t ValidateSMBuiltinsAtReference(
|
||||
spv_result_t ValidateNVSMOrARMCoreBuiltinsAtReference(
|
||||
const Decoration& decoration, const Instruction& built_in_inst,
|
||||
const Instruction& referenced_inst,
|
||||
const Instruction& referenced_from_inst);
|
||||
|
@ -3749,7 +3749,7 @@ spv_result_t BuiltInsValidator::ValidateFullyCoveredAtReference(
|
|||
return SPV_SUCCESS;
|
||||
}
|
||||
|
||||
spv_result_t BuiltInsValidator::ValidateSMBuiltinsAtDefinition(
|
||||
spv_result_t BuiltInsValidator::ValidateNVSMOrARMCoreBuiltinsAtDefinition(
|
||||
const Decoration& decoration, const Instruction& inst) {
|
||||
if (spvIsVulkanEnv(_.context()->target_env)) {
|
||||
if (spv_result_t error = ValidateI32(
|
||||
|
@ -3770,10 +3770,10 @@ spv_result_t BuiltInsValidator::ValidateSMBuiltinsAtDefinition(
|
|||
}
|
||||
|
||||
// Seed at reference checks with this built-in.
|
||||
return ValidateSMBuiltinsAtReference(decoration, inst, inst, inst);
|
||||
return ValidateNVSMOrARMCoreBuiltinsAtReference(decoration, inst, inst, inst);
|
||||
}
|
||||
|
||||
spv_result_t BuiltInsValidator::ValidateSMBuiltinsAtReference(
|
||||
spv_result_t BuiltInsValidator::ValidateNVSMOrARMCoreBuiltinsAtReference(
|
||||
const Decoration& decoration, const Instruction& built_in_inst,
|
||||
const Instruction& referenced_inst,
|
||||
const Instruction& referenced_from_inst) {
|
||||
|
@ -3797,7 +3797,7 @@ spv_result_t BuiltInsValidator::ValidateSMBuiltinsAtReference(
|
|||
if (function_id_ == 0) {
|
||||
// Propagate this rule to all dependant ids in the global scope.
|
||||
id_to_at_reference_checks_[referenced_from_inst.id()].push_back(std::bind(
|
||||
&BuiltInsValidator::ValidateSMBuiltinsAtReference, this, decoration,
|
||||
&BuiltInsValidator::ValidateNVSMOrARMCoreBuiltinsAtReference, this, decoration,
|
||||
built_in_inst, referenced_from_inst, std::placeholders::_1));
|
||||
}
|
||||
|
||||
|
@ -4225,11 +4225,16 @@ spv_result_t BuiltInsValidator::ValidateSingleBuiltInAtDefinition(
|
|||
case SpvBuiltInLocalInvocationIndex: {
|
||||
return ValidateLocalInvocationIndexAtDefinition(decoration, inst);
|
||||
}
|
||||
case SpvBuiltInCoreIDARM:
|
||||
case SpvBuiltInCoreCountARM:
|
||||
case SpvBuiltInCoreMaxIDARM:
|
||||
case SpvBuiltInWarpIDARM:
|
||||
case SpvBuiltInWarpMaxIDARM:
|
||||
case SpvBuiltInWarpsPerSMNV:
|
||||
case SpvBuiltInSMCountNV:
|
||||
case SpvBuiltInWarpIDNV:
|
||||
case SpvBuiltInSMIDNV: {
|
||||
return ValidateSMBuiltinsAtDefinition(decoration, inst);
|
||||
return ValidateNVSMOrARMCoreBuiltinsAtDefinition(decoration, inst);
|
||||
}
|
||||
case SpvBuiltInBaseInstance:
|
||||
case SpvBuiltInBaseVertex: {
|
||||
|
|
|
@ -853,17 +853,18 @@ spv_result_t CheckDecorationsOfEntryPoints(ValidationState_t& vstate) {
|
|||
(models->size() > 1 || has_vert)) {
|
||||
return vstate.diag(SPV_ERROR_INVALID_ID, var_instr)
|
||||
<< vstate.VkErrorID(6202)
|
||||
<< "OpEntryPoint interfaces variable must not be vertex "
|
||||
"execution model with an input storage class for "
|
||||
"Entry Point id "
|
||||
<< vstate.SpvDecorationString(decoration.dec_type())
|
||||
<< " decorated variable must not be used in vertex "
|
||||
"execution model as an Input storage class for Entry "
|
||||
"Point id "
|
||||
<< entry_point << ".";
|
||||
} else if (storage_class == SpvStorageClassOutput &&
|
||||
(models->size() > 1 || has_frag)) {
|
||||
return vstate.diag(SPV_ERROR_INVALID_ID, var_instr)
|
||||
<< vstate.VkErrorID(6201)
|
||||
<< "OpEntryPoint interfaces variable must not be "
|
||||
"fragment "
|
||||
"execution model with an output storage class for "
|
||||
<< vstate.SpvDecorationString(decoration.dec_type())
|
||||
<< " decorated variable must not be used in fragment "
|
||||
"execution model as an Output storage class for "
|
||||
"Entry Point id "
|
||||
<< entry_point << ".";
|
||||
}
|
||||
|
@ -1217,57 +1218,58 @@ spv_result_t CheckDecorationsOfBuffers(ValidationState_t& vstate) {
|
|||
<< "Structure id " << id << " decorated as " << deco_str
|
||||
<< " must be explicitly laid out with Offset "
|
||||
"decorations.";
|
||||
} else if (hasDecoration(id, SpvDecorationGLSLShared, vstate)) {
|
||||
return vstate.diag(SPV_ERROR_INVALID_ID, vstate.FindDef(id))
|
||||
<< "Structure id " << id << " decorated as " << deco_str
|
||||
<< " must not use GLSLShared decoration.";
|
||||
} else if (hasDecoration(id, SpvDecorationGLSLPacked, vstate)) {
|
||||
return vstate.diag(SPV_ERROR_INVALID_ID, vstate.FindDef(id))
|
||||
<< "Structure id " << id << " decorated as " << deco_str
|
||||
<< " must not use GLSLPacked decoration.";
|
||||
} else if (!checkForRequiredDecoration(
|
||||
id,
|
||||
[](SpvDecoration d) {
|
||||
return d == SpvDecorationArrayStride;
|
||||
},
|
||||
SpvOpTypeArray, vstate)) {
|
||||
}
|
||||
|
||||
if (!checkForRequiredDecoration(id,
|
||||
[](SpvDecoration d) {
|
||||
return d ==
|
||||
SpvDecorationArrayStride;
|
||||
},
|
||||
SpvOpTypeArray, vstate)) {
|
||||
return vstate.diag(SPV_ERROR_INVALID_ID, vstate.FindDef(id))
|
||||
<< "Structure id " << id << " decorated as " << deco_str
|
||||
<< " must be explicitly laid out with ArrayStride "
|
||||
"decorations.";
|
||||
} else if (!checkForRequiredDecoration(
|
||||
id,
|
||||
[](SpvDecoration d) {
|
||||
return d == SpvDecorationMatrixStride;
|
||||
},
|
||||
SpvOpTypeMatrix, vstate)) {
|
||||
}
|
||||
|
||||
if (!checkForRequiredDecoration(id,
|
||||
[](SpvDecoration d) {
|
||||
return d ==
|
||||
SpvDecorationMatrixStride;
|
||||
},
|
||||
SpvOpTypeMatrix, vstate)) {
|
||||
return vstate.diag(SPV_ERROR_INVALID_ID, vstate.FindDef(id))
|
||||
<< "Structure id " << id << " decorated as " << deco_str
|
||||
<< " must be explicitly laid out with MatrixStride "
|
||||
"decorations.";
|
||||
} else if (!checkForRequiredDecoration(
|
||||
id,
|
||||
[](SpvDecoration d) {
|
||||
return d == SpvDecorationRowMajor ||
|
||||
d == SpvDecorationColMajor;
|
||||
},
|
||||
SpvOpTypeMatrix, vstate)) {
|
||||
}
|
||||
|
||||
if (!checkForRequiredDecoration(
|
||||
id,
|
||||
[](SpvDecoration d) {
|
||||
return d == SpvDecorationRowMajor ||
|
||||
d == SpvDecorationColMajor;
|
||||
},
|
||||
SpvOpTypeMatrix, vstate)) {
|
||||
return vstate.diag(SPV_ERROR_INVALID_ID, vstate.FindDef(id))
|
||||
<< "Structure id " << id << " decorated as " << deco_str
|
||||
<< " must be explicitly laid out with RowMajor or "
|
||||
"ColMajor decorations.";
|
||||
} else if (blockRules &&
|
||||
(SPV_SUCCESS !=
|
||||
(recursive_status = checkLayout(
|
||||
id, sc_str, deco_str, true, scalar_block_layout, 0,
|
||||
constraints, vstate)))) {
|
||||
return recursive_status;
|
||||
} else if (bufferRules &&
|
||||
(SPV_SUCCESS !=
|
||||
(recursive_status = checkLayout(
|
||||
id, sc_str, deco_str, false, scalar_block_layout,
|
||||
0, constraints, vstate)))) {
|
||||
return recursive_status;
|
||||
}
|
||||
|
||||
if (spvIsVulkanEnv(vstate.context()->target_env)) {
|
||||
if (blockRules && (SPV_SUCCESS != (recursive_status = checkLayout(
|
||||
id, sc_str, deco_str, true,
|
||||
scalar_block_layout, 0,
|
||||
constraints, vstate)))) {
|
||||
return recursive_status;
|
||||
} else if (bufferRules &&
|
||||
(SPV_SUCCESS !=
|
||||
(recursive_status = checkLayout(
|
||||
id, sc_str, deco_str, false, scalar_block_layout,
|
||||
0, constraints, vstate)))) {
|
||||
return recursive_status;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1625,6 +1627,8 @@ spv_result_t CheckComponentDecoration(ValidationState_t& vstate,
|
|||
const Instruction& inst,
|
||||
const Decoration& decoration) {
|
||||
assert(inst.id() && "Parser ensures the target of the decoration has an ID");
|
||||
assert(decoration.params().size() == 1 &&
|
||||
"Grammar ensures Component has one parameter");
|
||||
|
||||
uint32_t type_id;
|
||||
if (decoration.struct_member_index() == Decoration::kInvalidMember) {
|
||||
|
@ -1673,23 +1677,48 @@ spv_result_t CheckComponentDecoration(ValidationState_t& vstate,
|
|||
if (!vstate.IsIntScalarOrVectorType(type_id) &&
|
||||
!vstate.IsFloatScalarOrVectorType(type_id)) {
|
||||
return vstate.diag(SPV_ERROR_INVALID_ID, &inst)
|
||||
<< vstate.VkErrorID(4924)
|
||||
<< "Component decoration specified for type "
|
||||
<< vstate.getIdName(type_id) << " that is not a scalar or vector";
|
||||
}
|
||||
|
||||
// For 16-, and 32-bit types, it is invalid if this sequence of components
|
||||
// gets larger than 3.
|
||||
const auto component = decoration.params()[0];
|
||||
if (component > 3) {
|
||||
return vstate.diag(SPV_ERROR_INVALID_ID, &inst)
|
||||
<< vstate.VkErrorID(4920)
|
||||
<< "Component decoration value must not be greater than 3";
|
||||
}
|
||||
|
||||
const auto dimension = vstate.GetDimension(type_id);
|
||||
const auto bit_width = vstate.GetBitWidth(type_id);
|
||||
if (bit_width == 16 || bit_width == 32) {
|
||||
assert(decoration.params().size() == 1 &&
|
||||
"Grammar ensures Component has one parameter");
|
||||
|
||||
const auto component = decoration.params()[0];
|
||||
const auto last_component = component + vstate.GetDimension(type_id) - 1;
|
||||
if (last_component > 3) {
|
||||
const auto sum_component = component + dimension;
|
||||
if (sum_component > 4) {
|
||||
return vstate.diag(SPV_ERROR_INVALID_ID, &inst)
|
||||
<< vstate.VkErrorID(4921)
|
||||
<< "Sequence of components starting with " << component
|
||||
<< " and ending with " << last_component
|
||||
<< " and ending with " << (sum_component - 1)
|
||||
<< " gets larger than 3";
|
||||
}
|
||||
} else if (bit_width == 64) {
|
||||
if (dimension > 2) {
|
||||
return vstate.diag(SPV_ERROR_INVALID_ID, &inst)
|
||||
<< "Component decoration only allowed on 64-bit scalar and "
|
||||
"2-component vector";
|
||||
}
|
||||
if (component == 1 || component == 3) {
|
||||
return vstate.diag(SPV_ERROR_INVALID_ID, &inst)
|
||||
<< vstate.VkErrorID(4923)
|
||||
<< "Component decoration value must not be 1 or 3 for 64-bit "
|
||||
"data types";
|
||||
}
|
||||
// 64-bit is double per component dimension
|
||||
const auto sum_component = component + (2 * dimension);
|
||||
if (sum_component > 4) {
|
||||
return vstate.diag(SPV_ERROR_INVALID_ID, &inst)
|
||||
<< vstate.VkErrorID(4922)
|
||||
<< "Sequence of components starting with " << component
|
||||
<< " and ending with " << (sum_component - 1)
|
||||
<< " gets larger than 3";
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1410,7 +1410,54 @@ spv_result_t ValidatePtrAccessChain(ValidationState_t& _,
|
|||
<< "VariablePointers or VariablePointersStorageBuffer";
|
||||
}
|
||||
}
|
||||
return ValidateAccessChain(_, inst);
|
||||
|
||||
// Need to call first, will make sure Base is a valid ID
|
||||
if (auto error = ValidateAccessChain(_, inst)) return error;
|
||||
|
||||
const auto base_id = inst->GetOperandAs<uint32_t>(2);
|
||||
const auto base = _.FindDef(base_id);
|
||||
const auto base_type = _.FindDef(base->type_id());
|
||||
const auto base_type_storage_class = base_type->word(2);
|
||||
|
||||
if (_.HasCapability(SpvCapabilityShader) &&
|
||||
(base_type_storage_class == SpvStorageClassUniform ||
|
||||
base_type_storage_class == SpvStorageClassStorageBuffer ||
|
||||
base_type_storage_class == SpvStorageClassPhysicalStorageBuffer ||
|
||||
base_type_storage_class == SpvStorageClassPushConstant ||
|
||||
(_.HasCapability(SpvCapabilityWorkgroupMemoryExplicitLayoutKHR) &&
|
||||
base_type_storage_class == SpvStorageClassWorkgroup)) &&
|
||||
!_.HasDecoration(base_type->id(), SpvDecorationArrayStride)) {
|
||||
return _.diag(SPV_ERROR_INVALID_DATA, inst)
|
||||
<< "OpPtrAccessChain must have a Base whose type is decorated "
|
||||
"with ArrayStride";
|
||||
}
|
||||
|
||||
if (spvIsVulkanEnv(_.context()->target_env)) {
|
||||
if (base_type_storage_class == SpvStorageClassWorkgroup) {
|
||||
if (!_.HasCapability(SpvCapabilityVariablePointers)) {
|
||||
return _.diag(SPV_ERROR_INVALID_DATA, inst)
|
||||
<< _.VkErrorID(7651)
|
||||
<< "OpPtrAccessChain Base operand pointing to Workgroup "
|
||||
"storage class must use VariablePointers capability";
|
||||
}
|
||||
} else if (base_type_storage_class == SpvStorageClassStorageBuffer) {
|
||||
if (!_.features().variable_pointers) {
|
||||
return _.diag(SPV_ERROR_INVALID_DATA, inst)
|
||||
<< _.VkErrorID(7652)
|
||||
<< "OpPtrAccessChain Base operand pointing to StorageBuffer "
|
||||
"storage class must use VariablePointers or "
|
||||
"VariablePointersStorageBuffer capability";
|
||||
}
|
||||
} else if (base_type_storage_class !=
|
||||
SpvStorageClassPhysicalStorageBuffer) {
|
||||
return _.diag(SPV_ERROR_INVALID_DATA, inst)
|
||||
<< _.VkErrorID(7650)
|
||||
<< "OpPtrAccessChain Base operand must point to Workgroup, "
|
||||
"StorageBuffer, or PhysicalStorageBuffer storage class";
|
||||
}
|
||||
}
|
||||
|
||||
return SPV_SUCCESS;
|
||||
}
|
||||
|
||||
spv_result_t ValidateArrayLength(ValidationState_t& state,
|
||||
|
|
|
@ -2094,6 +2094,16 @@ std::string ValidationState_t::VkErrorID(uint32_t id,
|
|||
return VUID_WRAP(VUID-StandaloneSpirv-Location-04918);
|
||||
case 4919:
|
||||
return VUID_WRAP(VUID-StandaloneSpirv-Location-04919);
|
||||
case 4920:
|
||||
return VUID_WRAP(VUID-StandaloneSpirv-Component-04920);
|
||||
case 4921:
|
||||
return VUID_WRAP(VUID-StandaloneSpirv-Component-04921);
|
||||
case 4922:
|
||||
return VUID_WRAP(VUID-StandaloneSpirv-Component-04922);
|
||||
case 4923:
|
||||
return VUID_WRAP(VUID-StandaloneSpirv-Component-04923);
|
||||
case 4924:
|
||||
return VUID_WRAP(VUID-StandaloneSpirv-Component-04924);
|
||||
case 6201:
|
||||
return VUID_WRAP(VUID-StandaloneSpirv-Flat-06201);
|
||||
case 6202:
|
||||
|
@ -2134,6 +2144,12 @@ std::string ValidationState_t::VkErrorID(uint32_t id,
|
|||
return VUID_WRAP(VUID-StandaloneSpirv-ExecutionModel-07320);
|
||||
case 7290:
|
||||
return VUID_WRAP(VUID-StandaloneSpirv-Input-07290);
|
||||
case 7650:
|
||||
return VUID_WRAP(VUID-StandaloneSpirv-Base-07650);
|
||||
case 7651:
|
||||
return VUID_WRAP(VUID-StandaloneSpirv-Base-07651);
|
||||
case 7652:
|
||||
return VUID_WRAP(VUID-StandaloneSpirv-Base-07652);
|
||||
default:
|
||||
return ""; // unknown id
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue