In future patches, this will allow us to first try compiling a geometry shader in DUAL_OBJECT mode (which is more efficient but uses more registers) and then if spilling is required, fall back on DUAL_INSTANCED mode. --- src/mesa/drivers/dri/i965/brw_vec4.h | 9 ++++++++- src/mesa/drivers/dri/i965/brw_vec4_gs_visitor.cpp | 7 ++++--- src/mesa/drivers/dri/i965/brw_vec4_gs_visitor.h | 3 ++- src/mesa/drivers/dri/i965/brw_vec4_reg_allocate.cpp | 5 ++++- src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp | 5 +++-- src/mesa/drivers/dri/i965/brw_vec4_vs_visitor.cpp | 2 +- src/mesa/drivers/dri/i965/test_vec4_register_coalesce.cpp | 2 +- 7 files changed, 23 insertions(+), 10 deletions(-)
diff --git a/src/mesa/drivers/dri/i965/brw_vec4.h b/src/mesa/drivers/dri/i965/brw_vec4.h index f99fdfa..fc8804f 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4.h +++ b/src/mesa/drivers/dri/i965/brw_vec4.h @@ -232,7 +232,8 @@ public: struct gl_shader_program *shader_prog, struct brw_shader *shader, void *mem_ctx, - bool debug_flag); + bool debug_flag, + bool no_spills); ~vec4_visitor(); dst_reg dst_null_f() @@ -531,6 +532,12 @@ protected: virtual int compute_array_stride(ir_dereference_array *ir); const bool debug_flag; + +private: + /** + * If true, then register allocation should fail instead of spilling. + */ + const bool no_spills; }; diff --git a/src/mesa/drivers/dri/i965/brw_vec4_gs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_vec4_gs_visitor.cpp index bd13082..8d8f20e 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4_gs_visitor.cpp +++ b/src/mesa/drivers/dri/i965/brw_vec4_gs_visitor.cpp @@ -37,10 +37,11 @@ vec4_gs_visitor::vec4_gs_visitor(struct brw_context *brw, struct brw_gs_compile *c, struct gl_shader_program *prog, struct brw_shader *shader, - void *mem_ctx) + void *mem_ctx, + bool no_spills) : vec4_visitor(brw, &c->base, &c->gp->program.Base, &c->key.base, &c->prog_data.base, prog, shader, mem_ctx, - INTEL_DEBUG & DEBUG_GS), + INTEL_DEBUG & DEBUG_GS, no_spills), c(c) { } @@ -562,7 +563,7 @@ brw_gs_emit(struct brw_context *brw, printf("\n\n"); } - vec4_gs_visitor v(brw, c, prog, shader, mem_ctx); + vec4_gs_visitor v(brw, c, prog, shader, mem_ctx, false /* no_spills */); if (!v.run()) { prog->LinkStatus = false; ralloc_strcat(&prog->InfoLog, v.fail_msg); diff --git a/src/mesa/drivers/dri/i965/brw_vec4_gs_visitor.h b/src/mesa/drivers/dri/i965/brw_vec4_gs_visitor.h index bdcb415..f7ca5f0 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4_gs_visitor.h +++ b/src/mesa/drivers/dri/i965/brw_vec4_gs_visitor.h @@ -81,7 +81,8 @@ public: struct brw_gs_compile *c, struct gl_shader_program *prog, struct brw_shader *shader, - void *mem_ctx); + void *mem_ctx, + bool no_spills); protected: virtual dst_reg *make_reg_for_system_value(ir_variable *ir); diff --git a/src/mesa/drivers/dri/i965/brw_vec4_reg_allocate.cpp b/src/mesa/drivers/dri/i965/brw_vec4_reg_allocate.cpp index 3777027..807c2f3 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4_reg_allocate.cpp +++ b/src/mesa/drivers/dri/i965/brw_vec4_reg_allocate.cpp @@ -214,7 +214,10 @@ vec4_visitor::reg_allocate() * loop back into here to try again. */ int reg = choose_spill_reg(g); - if (reg == -1) { + if (this->no_spills) { + fail("Failure to register allocate. Reduce number of live " + "values to avoid this."); + } else if (reg == -1) { fail("no register to spill\n"); } else { spill_reg(reg); diff --git a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp index 231815f..ecc6fe6 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp +++ b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp @@ -3143,8 +3143,9 @@ vec4_visitor::vec4_visitor(struct brw_context *brw, struct gl_shader_program *shader_prog, struct brw_shader *shader, void *mem_ctx, - bool debug_flag) - : debug_flag(debug_flag) + bool debug_flag, + bool no_spills) + : debug_flag(debug_flag), no_spills(no_spills) { this->brw = brw; this->ctx = &brw->ctx; diff --git a/src/mesa/drivers/dri/i965/brw_vec4_vs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_vec4_vs_visitor.cpp index 1f5cc25..31c42c4 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4_vs_visitor.cpp +++ b/src/mesa/drivers/dri/i965/brw_vec4_vs_visitor.cpp @@ -215,7 +215,7 @@ vec4_vs_visitor::vec4_vs_visitor(struct brw_context *brw, void *mem_ctx) : vec4_visitor(brw, &vs_compile->base, &vs_compile->vp->program.Base, &vs_compile->key.base, &vs_prog_data->base, prog, shader, - mem_ctx, INTEL_DEBUG & DEBUG_VS), + mem_ctx, INTEL_DEBUG & DEBUG_VS, false /* no_spills */), vs_compile(vs_compile), vs_prog_data(vs_prog_data) { diff --git a/src/mesa/drivers/dri/i965/test_vec4_register_coalesce.cpp b/src/mesa/drivers/dri/i965/test_vec4_register_coalesce.cpp index ab4498b..c5a3cfc 100644 --- a/src/mesa/drivers/dri/i965/test_vec4_register_coalesce.cpp +++ b/src/mesa/drivers/dri/i965/test_vec4_register_coalesce.cpp @@ -49,7 +49,7 @@ public: register_coalesce_vec4_visitor(struct brw_context *brw, struct gl_shader_program *shader_prog) : vec4_visitor(brw, NULL, NULL, NULL, NULL, shader_prog, NULL, NULL, - false) + false, false /* no_spills */) { } -- 1.8.4.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev