diff --git a/src/compiler/shader_info.h b/src/compiler/shader_info.h index 1acb1825fd5..dfaaa4f0fa6 100644 --- a/src/compiler/shader_info.h +++ b/src/compiler/shader_info.h @@ -49,6 +49,7 @@ struct spirv_supported_capabilities { bool float64_atomic_add; bool fragment_shader_sample_interlock; bool fragment_shader_pixel_interlock; + bool fragment_shading_rate; bool generic_pointers; bool geometry_streams; bool image_ms_array; diff --git a/src/compiler/spirv/spirv_to_nir.c b/src/compiler/spirv/spirv_to_nir.c index 990cff6b263..266375aeb2d 100644 --- a/src/compiler/spirv/spirv_to_nir.c +++ b/src/compiler/spirv/spirv_to_nir.c @@ -4456,6 +4456,10 @@ vtn_handle_preamble_instruction(struct vtn_builder *b, SpvOp opcode, spv_check_supported(image_atomic_int64, cap); break; + case SpvCapabilityFragmentShadingRateKHR: + spv_check_supported(fragment_shading_rate, cap); + break; + default: vtn_fail("Unhandled capability: %s (%u)", spirv_capability_to_string(cap), cap); diff --git a/src/compiler/spirv/vtn_variables.c b/src/compiler/spirv/vtn_variables.c index 3547490e391..9614792eb61 100644 --- a/src/compiler/spirv/vtn_variables.c +++ b/src/compiler/spirv/vtn_variables.c @@ -1107,6 +1107,19 @@ vtn_get_builtin_location(struct vtn_builder *b, *location = SYSTEM_VALUE_RAY_GEOMETRY_INDEX; set_mode_system_value(b, mode); break; + case SpvBuiltInShadingRateKHR: + *location = SYSTEM_VALUE_FRAG_SHADING_RATE; + set_mode_system_value(b, mode); + break; + case SpvBuiltInPrimitiveShadingRateKHR: + if (b->shader->info.stage == MESA_SHADER_VERTEX || + b->shader->info.stage == MESA_SHADER_GEOMETRY) { + *location = VARYING_SLOT_PRIMITIVE_SHADING_RATE; + *mode = nir_var_shader_out; + } else { + vtn_fail("invalid stage for SpvBuiltInPrimitiveShadingRateKHR"); + } + break; default: vtn_fail("Unsupported builtin: %s (%u)", spirv_builtin_to_string(builtin), builtin);