+
+static void
+insert_u64_bit(uint64_t *val, bool add)
+{
+ *val = (*val << 1) | !!add;
+}
+
+uint64_t
+brw_get_compiler_config_value(const struct brw_compiler *compiler)
+{
+ uint64_t config = 0;
+ insert_u64_bit(&config, compiler->precise_trig);
+ if (compiler->devinfo->gen >= 8 && compiler->devinfo->gen < 10) {
+ insert_u64_bit(&config, compiler->scalar_stage[MESA_SHADER_VERTEX]);
+ insert_u64_bit(&config, compiler->scalar_stage[MESA_SHADER_TESS_CTRL]);
+ insert_u64_bit(&config, compiler->scalar_stage[MESA_SHADER_TESS_EVAL]);
+ insert_u64_bit(&config, compiler->scalar_stage[MESA_SHADER_GEOMETRY]);
+ }
+ uint64_t debug_bits = INTEL_DEBUG;
+ uint64_t mask = DEBUG_DISK_CACHE_MASK;
+ while (mask != 0) {
+ const uint64_t bit = 1ULL << (ffsll(mask) - 1);
+ insert_u64_bit(&config, (debug_bits & bit) != 0);
+ mask &= ~bit;
+ }
+ return config;
+}
+
+unsigned
+brw_prog_data_size(gl_shader_stage stage)
+{
+ STATIC_ASSERT(MESA_SHADER_VERTEX == 0);
+ STATIC_ASSERT(MESA_SHADER_TESS_CTRL == 1);
+ STATIC_ASSERT(MESA_SHADER_TESS_EVAL == 2);
+ STATIC_ASSERT(MESA_SHADER_GEOMETRY == 3);
+ STATIC_ASSERT(MESA_SHADER_FRAGMENT == 4);
+ STATIC_ASSERT(MESA_SHADER_COMPUTE == 5);
+ static const size_t stage_sizes[] = {
+ sizeof(struct brw_vs_prog_data),
+ sizeof(struct brw_tcs_prog_data),
+ sizeof(struct brw_tes_prog_data),
+ sizeof(struct brw_gs_prog_data),
+ sizeof(struct brw_wm_prog_data),
+ sizeof(struct brw_cs_prog_data),
+ };
+ assert((int)stage >= 0 && stage < ARRAY_SIZE(stage_sizes));
+ return stage_sizes[stage];
+}
+
+unsigned
+brw_prog_key_size(gl_shader_stage stage)
+{
+ static const size_t stage_sizes[] = {
+ sizeof(struct brw_vs_prog_key),
+ sizeof(struct brw_tcs_prog_key),
+ sizeof(struct brw_tes_prog_key),
+ sizeof(struct brw_gs_prog_key),
+ sizeof(struct brw_wm_prog_key),
+ sizeof(struct brw_cs_prog_key),
+ };
+ assert((int)stage >= 0 && stage < ARRAY_SIZE(stage_sizes));
+ return stage_sizes[stage];
+}
+
+void
+brw_prog_key_set_id(union brw_any_prog_key *key,
+ gl_shader_stage stage,
+ unsigned id)
+{
+ static const unsigned stage_offsets[] = {
+ offsetof(struct brw_vs_prog_key, program_string_id),
+ offsetof(struct brw_tcs_prog_key, program_string_id),
+ offsetof(struct brw_tes_prog_key, program_string_id),
+ offsetof(struct brw_gs_prog_key, program_string_id),
+ offsetof(struct brw_wm_prog_key, program_string_id),
+ offsetof(struct brw_cs_prog_key, program_string_id),
+ };
+ assert((int)stage >= 0 && stage < ARRAY_SIZE(stage_offsets));
+ *(unsigned*)((uint8_t*)key + stage_offsets[stage]) = id;
+}