#include "sid.h"
#include "vk_format.h"
-static const struct nir_shader_compiler_options nir_options = {
- .vertex_id_zero_based = true,
- .lower_scmp = true,
- .lower_flrp16 = true,
- .lower_flrp32 = true,
- .lower_flrp64 = true,
- .lower_device_index_to_zero = true,
- .lower_fdiv = true,
- .lower_fmod = true,
- .lower_ineg = true,
- .lower_bitfield_insert_to_bitfield_select = true,
- .lower_bitfield_extract = true,
- .lower_pack_snorm_2x16 = true,
- .lower_pack_snorm_4x8 = true,
- .lower_pack_unorm_2x16 = true,
- .lower_pack_unorm_4x8 = true,
- .lower_pack_half_2x16 = true,
- .lower_pack_64_2x32 = true,
- .lower_pack_64_4x16 = true,
- .lower_pack_32_2x16 = true,
- .lower_unpack_snorm_2x16 = true,
- .lower_unpack_snorm_4x8 = true,
- .lower_unpack_unorm_2x16 = true,
- .lower_unpack_unorm_4x8 = true,
- .lower_unpack_half_2x16 = true,
- .lower_ffma16 = true,
- .lower_ffma32 = true,
- .lower_ffma64 = true,
- .lower_fpow = true,
- .lower_mul_2x32_64 = true,
- .lower_rotate = true,
- .has_fsub = true,
- .has_isub = true,
- .use_scoped_barrier = true,
- .max_unroll_iterations = 32,
- .max_unroll_iterations_aggressive = 128,
- .use_interpolated_input_intrinsics = true,
- .vectorize_vec2_16bit = true,
- /* nir_lower_int64() isn't actually called for the LLVM backend, but
- * this helps the loop unrolling heuristics. */
- .lower_int64_options = nir_lower_imul64 | nir_lower_imul_high64 | nir_lower_imul_2x32_64 |
- nir_lower_divmod64 | nir_lower_minmax64 | nir_lower_iabs64,
- .lower_doubles_options = nir_lower_drcp | nir_lower_dsqrt | nir_lower_drsq | nir_lower_ddiv,
- .divergence_analysis_options = nir_divergence_view_index_uniform,
-};
+void
+radv_get_nir_options(struct radv_physical_device *device)
+{
+ device->nir_options = (nir_shader_compiler_options){
+ .vertex_id_zero_based = true,
+ .lower_scmp = true,
+ .lower_flrp16 = true,
+ .lower_flrp32 = true,
+ .lower_flrp64 = true,
+ .lower_device_index_to_zero = true,
+ .lower_fdiv = true,
+ .lower_fmod = true,
+ .lower_ineg = true,
+ .lower_bitfield_insert_to_bitfield_select = true,
+ .lower_bitfield_extract = true,
+ .lower_pack_snorm_2x16 = true,
+ .lower_pack_snorm_4x8 = true,
+ .lower_pack_unorm_2x16 = true,
+ .lower_pack_unorm_4x8 = true,
+ .lower_pack_half_2x16 = true,
+ .lower_pack_64_2x32 = true,
+ .lower_pack_64_4x16 = true,
+ .lower_pack_32_2x16 = true,
+ .lower_unpack_snorm_2x16 = true,
+ .lower_unpack_snorm_4x8 = true,
+ .lower_unpack_unorm_2x16 = true,
+ .lower_unpack_unorm_4x8 = true,
+ .lower_unpack_half_2x16 = true,
+ .lower_ffma16 = true,
+ .lower_ffma32 = true,
+ .lower_ffma64 = true,
+ .lower_fpow = true,
+ .lower_mul_2x32_64 = true,
+ .lower_rotate = true,
+ .has_fsub = true,
+ .has_isub = true,
+ .use_scoped_barrier = true,
+ .max_unroll_iterations = 32,
+ .max_unroll_iterations_aggressive = 128,
+ .use_interpolated_input_intrinsics = true,
+ .vectorize_vec2_16bit = true,
+ /* nir_lower_int64() isn't actually called for the LLVM backend,
+ * but this helps the loop unrolling heuristics. */
+ .lower_int64_options = nir_lower_imul64 | nir_lower_imul_high64 | nir_lower_imul_2x32_64 |
+ nir_lower_divmod64 | nir_lower_minmax64 | nir_lower_iabs64,
+ .lower_doubles_options = nir_lower_drcp | nir_lower_dsqrt | nir_lower_drsq | nir_lower_ddiv,
+ .divergence_analysis_options = nir_divergence_view_index_uniform,
+ };
+}
bool
radv_can_dump_shader(struct radv_device *device, struct vk_shader_module *module,
* shader directly. In that case, we just ignore the SPIR-V entirely
* and just use the NIR shader */
nir = module->nir;
- nir->options = &nir_options;
+ nir->options = &device->physical_device->nir_options;
nir_validate_shader(nir, "in internal shader");
assert(exec_list_length(&nir->functions) == 1);
},
};
nir = spirv_to_nir(spirv, module->size / 4, spec_entries, num_spec_entries, stage,
- entrypoint_name, &spirv_options, &nir_options);
+ entrypoint_name, &spirv_options, &device->physical_device->nir_options);
assert(nir->info.stage == stage);
nir_validate_shader(nir, "after spirv_to_nir");