brw_nir_setup_glsl_uniforms(mem_ctx, nir, &tep->program,
&prog_data.base.base,
compiler->scalar_stage[MESA_SHADER_TESS_EVAL]);
- brw_nir_analyze_ubo_ranges(compiler, tep->program.nir,
+ brw_nir_analyze_ubo_ranges(compiler, tep->program.nir, NULL,
prog_data.base.base.ubo_ranges);
int st_index = -1;
brw_compile_tes(compiler, brw, mem_ctx, key, &input_vue_map, &prog_data,
nir, &tep->program, st_index, &error_str);
if (program == NULL) {
- tep->program.sh.data->LinkStatus = linking_failure;
+ tep->program.sh.data->LinkStatus = LINKING_FAILURE;
ralloc_strcat(&tep->program.sh.data->InfoLog, error_str);
_mesa_problem(NULL, "Failed to compile tessellation evaluation shader: "
brw_tes_populate_key(brw, &key);
- if (!brw_search_cache(&brw->cache, BRW_CACHE_TES_PROG,
- &key, sizeof(key),
- &stage_state->prog_offset,
- &brw->tes.base.prog_data)) {
- bool success = brw_codegen_tes_prog(brw, tep, &key);
- assert(success);
- (void)success;
- }
+ if (brw_search_cache(&brw->cache, BRW_CACHE_TES_PROG, &key, sizeof(key),
+ &stage_state->prog_offset, &brw->tes.base.prog_data,
+ true))
+ return;
+
+ if (brw_disk_cache_upload_program(brw, MESA_SHADER_TESS_EVAL))
+ return;
+
+ tep = (struct brw_program *) brw->programs[MESA_SHADER_TESS_EVAL];
+ tep->id = key.program_string_id;
+
+ MAYBE_UNUSED bool success = brw_codegen_tes_prog(brw, tep, &key);
+ assert(success);
}
+void
+brw_tes_populate_default_key(const struct gen_device_info *devinfo,
+ struct brw_tes_prog_key *key,
+ struct gl_shader_program *sh_prog,
+ struct gl_program *prog)
+{
+ struct brw_program *btep = brw_program(prog);
+
+ memset(key, 0, sizeof(*key));
+
+ key->program_string_id = btep->id;
+ key->inputs_read = prog->nir->info.inputs_read;
+ key->patch_inputs_read = prog->nir->info.patch_inputs_read;
+
+ if (sh_prog->_LinkedShaders[MESA_SHADER_TESS_CTRL]) {
+ struct gl_program *tcp =
+ sh_prog->_LinkedShaders[MESA_SHADER_TESS_CTRL]->Program;
+ key->inputs_read |= tcp->nir->info.outputs_written &
+ ~(VARYING_BIT_TESS_LEVEL_INNER | VARYING_BIT_TESS_LEVEL_OUTER);
+ key->patch_inputs_read |= tcp->nir->info.patch_outputs_written;
+ }
+
+ brw_setup_tex_for_precompile(devinfo, &key->tex, prog);
+}
bool
brw_tes_precompile(struct gl_context *ctx,
struct brw_program *btep = brw_program(prog);
- memset(&key, 0, sizeof(key));
-
- key.program_string_id = btep->id;
- key.inputs_read = prog->nir->info.inputs_read;
- key.patch_inputs_read = prog->nir->info.patch_inputs_read;
-
- if (shader_prog->_LinkedShaders[MESA_SHADER_TESS_CTRL]) {
- struct gl_program *tcp =
- shader_prog->_LinkedShaders[MESA_SHADER_TESS_CTRL]->Program;
- key.inputs_read |= tcp->nir->info.outputs_written &
- ~(VARYING_BIT_TESS_LEVEL_INNER | VARYING_BIT_TESS_LEVEL_OUTER);
- key.patch_inputs_read |= tcp->nir->info.patch_outputs_written;
- }
-
- brw_setup_tex_for_precompile(brw, &key.tex, prog);
+ brw_tes_populate_default_key(&brw->screen->devinfo, &key, shader_prog, prog);
success = brw_codegen_tes_prog(brw, btep, &key);