mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-24 19:40:10 +01:00
i965: Refactor fs_generator API
We split out SIMD8 and SIMD16 generation into seperate calls to new method generate_code(), which returns the start offset for the generated code. A new get_assembly() method returns the generated code. This avoids asserting MESA_SHADER_FRAGMENT and accessing wm_prog_data in the generator. Signed-off-by: Kristian Høgsberg <krh@bitplanet.net> Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
parent
13849f327c
commit
f2bb655ac7
4 changed files with 23 additions and 39 deletions
|
|
@ -45,7 +45,9 @@ const unsigned *
|
|||
brw_blorp_eu_emitter::get_program(unsigned *program_size)
|
||||
{
|
||||
cfg_t cfg(&insts);
|
||||
return generator.generate_assembly(NULL, &cfg, program_size);
|
||||
generator.generate_code(&cfg, 16);
|
||||
|
||||
return generator.get_assembly(program_size);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -3729,11 +3729,12 @@ brw_wm_fs_emit(struct brw_context *brw,
|
|||
prog_data->no_8 = false;
|
||||
}
|
||||
|
||||
const unsigned *assembly = NULL;
|
||||
fs_generator g(brw, mem_ctx, key, prog_data, prog, fp,
|
||||
v.runtime_check_aads_emit, INTEL_DEBUG & DEBUG_WM);
|
||||
assembly = g.generate_assembly(simd8_cfg, simd16_cfg,
|
||||
final_assembly_size);
|
||||
if (simd8_cfg)
|
||||
g.generate_code(simd8_cfg, 8);
|
||||
if (simd16_cfg)
|
||||
prog_data->prog_offset_16 = g.generate_code(simd16_cfg, 16);
|
||||
|
||||
if (unlikely(brw->perf_debug) && shader) {
|
||||
if (shader->compiled_once)
|
||||
|
|
@ -3746,7 +3747,7 @@ brw_wm_fs_emit(struct brw_context *brw,
|
|||
}
|
||||
}
|
||||
|
||||
return assembly;
|
||||
return g.get_assembly(final_assembly_size);
|
||||
}
|
||||
|
||||
bool
|
||||
|
|
|
|||
|
|
@ -697,12 +697,10 @@ public:
|
|||
bool debug_flag);
|
||||
~fs_generator();
|
||||
|
||||
const unsigned *generate_assembly(const cfg_t *simd8_cfg,
|
||||
const cfg_t *simd16_cfg,
|
||||
unsigned *assembly_size);
|
||||
int generate_code(const cfg_t *cfg, int dispatch_width);
|
||||
const unsigned *get_assembly(unsigned int *assembly_size);
|
||||
|
||||
private:
|
||||
void generate_code(const cfg_t *cfg);
|
||||
void fire_fb_write(fs_inst *inst,
|
||||
struct brw_reg payload,
|
||||
struct brw_reg implied_header,
|
||||
|
|
|
|||
|
|
@ -1512,9 +1512,17 @@ fs_generator::generate_untyped_surface_read(fs_inst *inst, struct brw_reg dst,
|
|||
brw_mark_surface_used(prog_data, surf_index.dw1.ud);
|
||||
}
|
||||
|
||||
void
|
||||
fs_generator::generate_code(const cfg_t *cfg)
|
||||
int
|
||||
fs_generator::generate_code(const cfg_t *cfg, int dispatch_width)
|
||||
{
|
||||
/* align to 64 byte boundary. */
|
||||
while (p->next_insn_offset % 64)
|
||||
brw_NOP(p);
|
||||
|
||||
this->dispatch_width = dispatch_width;
|
||||
if (dispatch_width == 16)
|
||||
brw_set_default_compression_control(p, BRW_COMPRESSION_COMPRESSED);
|
||||
|
||||
int start_offset = p->next_insn_offset;
|
||||
int loop_count = 0;
|
||||
|
||||
|
|
@ -2024,37 +2032,12 @@ fs_generator::generate_code(const cfg_t *cfg)
|
|||
dump_assembly(p->store, annotation.ann_count, annotation.ann, brw, prog);
|
||||
ralloc_free(annotation.ann);
|
||||
}
|
||||
|
||||
return start_offset;
|
||||
}
|
||||
|
||||
const unsigned *
|
||||
fs_generator::generate_assembly(const cfg_t *simd8_cfg,
|
||||
const cfg_t *simd16_cfg,
|
||||
unsigned *assembly_size)
|
||||
fs_generator::get_assembly(unsigned int *assembly_size)
|
||||
{
|
||||
assert(simd8_cfg || simd16_cfg);
|
||||
|
||||
if (simd8_cfg) {
|
||||
dispatch_width = 8;
|
||||
generate_code(simd8_cfg);
|
||||
}
|
||||
|
||||
if (simd16_cfg) {
|
||||
/* align to 64 byte boundary. */
|
||||
while (p->next_insn_offset % 64) {
|
||||
brw_NOP(p);
|
||||
}
|
||||
|
||||
assert(stage == MESA_SHADER_FRAGMENT);
|
||||
brw_wm_prog_data *prog_data = (brw_wm_prog_data*) this->prog_data;
|
||||
|
||||
/* Save off the start of this SIMD16 program */
|
||||
prog_data->prog_offset_16 = p->next_insn_offset;
|
||||
|
||||
brw_set_default_compression_control(p, BRW_COMPRESSION_COMPRESSED);
|
||||
|
||||
dispatch_width = 16;
|
||||
generate_code(simd16_cfg);
|
||||
}
|
||||
|
||||
return brw_get_program(p, assembly_size);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue