i965/fs: Plumb a mem_ctx all the way through the FS compile.

'c' is going away, but we still need a memory context that lives
for the duration of the compile.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Chris Forbes <chrisf@ijw.co.nz>
This commit is contained in:
Kenneth Graunke 2014-05-14 01:21:02 -07:00
parent 25f8fbbf2f
commit 2d4ac9b5b8
8 changed files with 23 additions and 15 deletions

View file

@ -27,7 +27,7 @@
brw_blorp_eu_emitter::brw_blorp_eu_emitter(struct brw_context *brw)
: mem_ctx(ralloc_context(NULL)), c(rzalloc(mem_ctx, struct brw_wm_compile)),
generator(brw, c, NULL, NULL, false)
generator(brw, mem_ctx, c, NULL, NULL, false)
{
}

View file

@ -3103,7 +3103,9 @@ fs_visitor::run()
}
const unsigned *
brw_wm_fs_emit(struct brw_context *brw, struct brw_wm_compile *c,
brw_wm_fs_emit(struct brw_context *brw,
void *mem_ctx,
struct brw_wm_compile *c,
struct gl_fragment_program *fp,
struct gl_shader_program *prog,
unsigned *final_assembly_size)
@ -3126,7 +3128,7 @@ brw_wm_fs_emit(struct brw_context *brw, struct brw_wm_compile *c,
/* Now the main event: Visit the shader IR and generate our FS IR for it.
*/
fs_visitor v(brw, c, prog, fp, 8);
fs_visitor v(brw, mem_ctx, c, prog, fp, 8);
if (!v.run()) {
if (prog) {
prog->LinkStatus = false;
@ -3140,7 +3142,7 @@ brw_wm_fs_emit(struct brw_context *brw, struct brw_wm_compile *c,
}
exec_list *simd16_instructions = NULL;
fs_visitor v2(brw, c, prog, fp, 16);
fs_visitor v2(brw, mem_ctx, c, prog, fp, 16);
if (brw->gen >= 5 && likely(!(INTEL_DEBUG & DEBUG_NO16))) {
if (!v.simd16_unsupported) {
/* Try a SIMD16 compile */
@ -3159,11 +3161,11 @@ brw_wm_fs_emit(struct brw_context *brw, struct brw_wm_compile *c,
const unsigned *assembly = NULL;
if (brw->gen >= 8) {
gen8_fs_generator g(brw, c, prog, fp, v.do_dual_src);
gen8_fs_generator g(brw, mem_ctx, c, prog, fp, v.do_dual_src);
assembly = g.generate_assembly(&v.instructions, simd16_instructions,
final_assembly_size);
} else {
fs_generator g(brw, c, prog, fp, v.do_dual_src);
fs_generator g(brw, mem_ctx, c, prog, fp, v.do_dual_src);
assembly = g.generate_assembly(&v.instructions, simd16_instructions,
final_assembly_size);
}

View file

@ -250,6 +250,7 @@ class fs_visitor : public backend_visitor
public:
fs_visitor(struct brw_context *brw,
void *mem_ctx,
struct brw_wm_compile *c,
struct gl_shader_program *shader_prog,
struct gl_fragment_program *fp,
@ -596,6 +597,7 @@ class fs_generator
{
public:
fs_generator(struct brw_context *brw,
void *mem_ctx,
struct brw_wm_compile *c,
struct gl_shader_program *prog,
struct gl_fragment_program *fp,
@ -722,6 +724,7 @@ class gen8_fs_generator : public gen8_generator
{
public:
gen8_fs_generator(struct brw_context *brw,
void *mem_ctx,
struct brw_wm_compile *c,
struct gl_shader_program *prog,
struct gl_fragment_program *fp,

View file

@ -37,18 +37,17 @@ extern "C" {
#include "brw_cfg.h"
fs_generator::fs_generator(struct brw_context *brw,
void *mem_ctx,
struct brw_wm_compile *c,
struct gl_shader_program *prog,
struct gl_fragment_program *fp,
bool dual_source_output)
: brw(brw), c(c), key(&c->key), prog(prog), fp(fp), dual_source_output(dual_source_output)
: brw(brw), c(c), key(&c->key), prog(prog), fp(fp), dual_source_output(dual_source_output), mem_ctx(mem_ctx)
{
ctx = &brw->ctx;
prog_data = &c->prog_data;
mem_ctx = c;
p = rzalloc(mem_ctx, struct brw_compile);
brw_init_compile(brw, p, mem_ctx);
}

View file

@ -2954,6 +2954,7 @@ fs_visitor::resolve_bool_comparison(ir_rvalue *rvalue, fs_reg *reg)
}
fs_visitor::fs_visitor(struct brw_context *brw,
void *mem_ctx,
struct brw_wm_compile *c,
struct gl_shader_program *shader_prog,
struct gl_fragment_program *fp,
@ -2966,7 +2967,7 @@ fs_visitor::fs_visitor(struct brw_context *brw,
this->c = c;
this->prog_data = &c->prog_data;
this->fp = fp;
this->mem_ctx = c;
this->mem_ctx = mem_ctx;
this->failed = false;
this->simd16_unsupported = false;
this->no16_msg = NULL;

View file

@ -146,6 +146,7 @@ bool do_wm_prog(struct brw_context *brw,
struct brw_wm_prog_key *key)
{
struct gl_context *ctx = &brw->ctx;
void *mem_ctx = ralloc_context(NULL);
struct brw_wm_compile *c;
const GLuint *program;
struct gl_shader *fs = NULL;
@ -154,7 +155,7 @@ bool do_wm_prog(struct brw_context *brw,
if (prog)
fs = prog->_LinkedShaders[MESA_SHADER_FRAGMENT];
c = rzalloc(NULL, struct brw_wm_compile);
c = rzalloc(mem_ctx, struct brw_wm_compile);
/* Allocate the references to the uniforms that will end up in the
* prog_data associated with the compiled program, and which will be freed
@ -180,9 +181,9 @@ bool do_wm_prog(struct brw_context *brw,
c->key.persample_shading,
&fp->program);
program = brw_wm_fs_emit(brw, c, &fp->program, prog, &program_size);
program = brw_wm_fs_emit(brw, mem_ctx, c, &fp->program, prog, &program_size);
if (program == NULL) {
ralloc_free(c);
ralloc_free(mem_ctx);
return false;
}
@ -200,7 +201,7 @@ bool do_wm_prog(struct brw_context *brw,
&c->prog_data, sizeof(c->prog_data),
&brw->wm.base.prog_offset, &brw->wm.prog_data);
ralloc_free(c);
ralloc_free(mem_ctx);
return true;
}

View file

@ -91,6 +91,7 @@ struct brw_wm_compile {
* Returns the final assembly and the program's size.
*/
const unsigned *brw_wm_fs_emit(struct brw_context *brw,
void *mem_ctx,
struct brw_wm_compile *c,
struct gl_fragment_program *fp,
struct gl_shader_program *prog,

View file

@ -36,11 +36,12 @@ extern "C" {
#include "glsl/ir_print_visitor.h"
gen8_fs_generator::gen8_fs_generator(struct brw_context *brw,
void *mem_ctx,
struct brw_wm_compile *c,
struct gl_shader_program *shader_prog,
struct gl_fragment_program *fp,
bool dual_source_output)
: gen8_generator(brw, shader_prog, fp ? &fp->Base : NULL, c),
: gen8_generator(brw, shader_prog, fp ? &fp->Base : NULL, mem_ctx),
c(c), key(&c->key),
fp(fp), dual_source_output(dual_source_output)
{