i965/fs: Rework wm_fs_emit to take a nir_shader and a brw_compiler
This commit removes all dependence on GL state by getting rid of the brw_context parameter and the GL data structures. Reviewed-by: Topi Pohjolainen <topi.pohjolainen@intel.com>
This commit is contained in:
@@ -5093,40 +5093,39 @@ fs_visitor::run_cs()
|
||||
}
|
||||
|
||||
const unsigned *
|
||||
brw_wm_fs_emit(struct brw_context *brw,
|
||||
brw_wm_fs_emit(const struct brw_compiler *compiler, void *log_data,
|
||||
void *mem_ctx,
|
||||
const struct brw_wm_prog_key *key,
|
||||
struct brw_wm_prog_data *prog_data,
|
||||
struct gl_fragment_program *fp,
|
||||
struct gl_shader_program *prog,
|
||||
const nir_shader *shader,
|
||||
struct gl_program *prog,
|
||||
int shader_time_index8, int shader_time_index16,
|
||||
unsigned *final_assembly_size)
|
||||
bool use_rep_send,
|
||||
unsigned *final_assembly_size,
|
||||
char **error_str)
|
||||
{
|
||||
/* Now the main event: Visit the shader IR and generate our FS IR for it.
|
||||
*/
|
||||
fs_visitor v(brw->intelScreen->compiler, brw, mem_ctx, key,
|
||||
&prog_data->base, &fp->Base, fp->Base.nir, 8, shader_time_index8);
|
||||
fs_visitor v(compiler, log_data, mem_ctx, key,
|
||||
&prog_data->base, prog, shader, 8,
|
||||
shader_time_index8);
|
||||
if (!v.run_fs(false /* do_rep_send */)) {
|
||||
if (prog) {
|
||||
prog->LinkStatus = false;
|
||||
ralloc_strcat(&prog->InfoLog, v.fail_msg);
|
||||
}
|
||||
|
||||
_mesa_problem(NULL, "Failed to compile fragment shader: %s\n",
|
||||
v.fail_msg);
|
||||
if (error_str)
|
||||
*error_str = ralloc_strdup(mem_ctx, v.fail_msg);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
cfg_t *simd16_cfg = NULL;
|
||||
fs_visitor v2(brw->intelScreen->compiler, brw, mem_ctx, key,
|
||||
&prog_data->base, &fp->Base, fp->Base.nir, 16, shader_time_index16);
|
||||
if (likely(!(INTEL_DEBUG & DEBUG_NO16) || brw->use_rep_send)) {
|
||||
fs_visitor v2(compiler, log_data, mem_ctx, key,
|
||||
&prog_data->base, prog, shader, 16,
|
||||
shader_time_index16);
|
||||
if (likely(!(INTEL_DEBUG & DEBUG_NO16) || use_rep_send)) {
|
||||
if (!v.simd16_unsupported) {
|
||||
/* Try a SIMD16 compile */
|
||||
v2.import_uniforms(&v);
|
||||
if (!v2.run_fs(brw->use_rep_send)) {
|
||||
perf_debug("SIMD16 shader failed to compile: %s", v2.fail_msg);
|
||||
if (!v2.run_fs(use_rep_send)) {
|
||||
compiler->shader_perf_log(log_data,
|
||||
"SIMD16 shader failed to compile: %s",
|
||||
v2.fail_msg);
|
||||
} else {
|
||||
simd16_cfg = v2.cfg;
|
||||
}
|
||||
@@ -5134,8 +5133,8 @@ brw_wm_fs_emit(struct brw_context *brw,
|
||||
}
|
||||
|
||||
cfg_t *simd8_cfg;
|
||||
int no_simd8 = (INTEL_DEBUG & DEBUG_NO8) || brw->no_simd8;
|
||||
if ((no_simd8 || brw->gen < 5) && simd16_cfg) {
|
||||
int no_simd8 = (INTEL_DEBUG & DEBUG_NO8) || use_rep_send;
|
||||
if ((no_simd8 || compiler->devinfo->gen < 5) && simd16_cfg) {
|
||||
simd8_cfg = NULL;
|
||||
prog_data->no_8 = true;
|
||||
} else {
|
||||
@@ -5143,20 +5142,14 @@ brw_wm_fs_emit(struct brw_context *brw,
|
||||
prog_data->no_8 = false;
|
||||
}
|
||||
|
||||
fs_generator g(brw->intelScreen->compiler, brw,
|
||||
mem_ctx, (void *) key, &prog_data->base,
|
||||
fs_generator g(compiler, log_data, mem_ctx, (void *) key, &prog_data->base,
|
||||
v.promoted_constants, v.runtime_check_aads_emit, "FS");
|
||||
|
||||
if (unlikely(INTEL_DEBUG & DEBUG_WM)) {
|
||||
char *name;
|
||||
if (prog)
|
||||
name = ralloc_asprintf(mem_ctx, "%s fragment shader %d",
|
||||
prog->Label ? prog->Label : "unnamed",
|
||||
prog->Name);
|
||||
else
|
||||
name = ralloc_asprintf(mem_ctx, "fragment program %d", fp->Base.Id);
|
||||
|
||||
g.enable_debug(name);
|
||||
g.enable_debug(ralloc_asprintf(mem_ctx, "%s fragment shader %s",
|
||||
shader->info.label ? shader->info.label :
|
||||
"unnamed",
|
||||
shader->info.name));
|
||||
}
|
||||
|
||||
if (simd8_cfg)
|
||||
|
||||
@@ -230,9 +230,19 @@ brw_codegen_wm_prog(struct brw_context *brw,
|
||||
st_index16 = brw_get_shader_time_index(brw, prog, &fp->program.Base, ST_FS16);
|
||||
}
|
||||
|
||||
program = brw_wm_fs_emit(brw, mem_ctx, key, &prog_data,
|
||||
&fp->program, prog, st_index8, st_index16, &program_size);
|
||||
char *error_str = NULL;
|
||||
program = brw_wm_fs_emit(brw->intelScreen->compiler, brw, mem_ctx,
|
||||
key, &prog_data, fp->program.Base.nir,
|
||||
&fp->program.Base, st_index8, st_index16,
|
||||
brw->use_rep_send, &program_size, &error_str);
|
||||
if (program == NULL) {
|
||||
if (prog) {
|
||||
prog->LinkStatus = false;
|
||||
ralloc_strcat(&prog->InfoLog, error_str);
|
||||
}
|
||||
|
||||
_mesa_problem(NULL, "Failed to compile fragment shader: %s\n", error_str);
|
||||
|
||||
ralloc_free(mem_ctx);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -61,20 +61,25 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
struct nir_shader;
|
||||
|
||||
/**
|
||||
* Compile a fragment shader.
|
||||
*
|
||||
* Returns the final assembly and the program's size.
|
||||
*/
|
||||
const unsigned *brw_wm_fs_emit(struct brw_context *brw,
|
||||
const unsigned *brw_wm_fs_emit(const struct brw_compiler *compiler,
|
||||
void *log_data,
|
||||
void *mem_ctx,
|
||||
const struct brw_wm_prog_key *key,
|
||||
struct brw_wm_prog_data *prog_data,
|
||||
struct gl_fragment_program *fp,
|
||||
struct gl_shader_program *prog,
|
||||
const struct nir_shader *shader,
|
||||
struct gl_program *prog,
|
||||
int shader_time_index8,
|
||||
int shader_time_index16,
|
||||
unsigned *final_assembly_size);
|
||||
bool use_rep_send,
|
||||
unsigned *final_assembly_size,
|
||||
char **error_str);
|
||||
|
||||
GLboolean brw_link_shader(struct gl_context *ctx, struct gl_shader_program *prog);
|
||||
struct gl_shader *brw_new_shader(struct gl_context *ctx, GLuint name, GLuint type);
|
||||
|
||||
Reference in New Issue
Block a user