From: Kenneth Graunke Date: Tue, 30 Jun 2015 05:50:28 +0000 (-0700) Subject: i965: Add a fs_visitor constructor that takes a brw_gs_compile. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=b3ebf03b8406f9f1cd215b98ebdd3fc751f73559;p=mesa.git i965: Add a fs_visitor constructor that takes a brw_gs_compile. Unlike the vs/wm structs, brw_gs_compile is actually useful: it contains the input VUE map and information about the control data headers. Passing this in allows us to share that code in brw_gs.c, and calculate them before deciding on vec4 vs. scalar mode, as it's independent of that choice. Signed-off-by: Kenneth Graunke Reviewed-by: Kristian Høgsberg --- diff --git a/src/mesa/drivers/dri/i965/brw_fs.h b/src/mesa/drivers/dri/i965/brw_fs.h index f4d2e14b821..50e98becf03 100644 --- a/src/mesa/drivers/dri/i965/brw_fs.h +++ b/src/mesa/drivers/dri/i965/brw_fs.h @@ -62,6 +62,8 @@ namespace brw { class fs_live_variables; } +struct brw_gs_compile; + static inline fs_reg offset(fs_reg reg, const brw::fs_builder& bld, unsigned delta) { @@ -99,7 +101,12 @@ public: const nir_shader *shader, unsigned dispatch_width, int shader_time_index); - + fs_visitor(const struct brw_compiler *compiler, void *log_data, + void *mem_ctx, + struct brw_gs_compile *gs_compile, + struct brw_gs_prog_data *prog_data, + const nir_shader *shader); + void init(); ~fs_visitor(); fs_reg vgrf(const glsl_type *const type); @@ -298,6 +305,8 @@ public: const void *const key; const struct brw_sampler_prog_key_data *key_tex; + struct brw_gs_compile *gs_compile; + struct brw_stage_prog_data *prog_data; struct gl_program *prog; diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp index 1b6a199fffa..7cc4f3c927a 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp @@ -41,6 +41,7 @@ #include "brw_wm.h" #include "brw_cs.h" #include "brw_vec4.h" +#include "brw_vec4_gs_visitor.h" #include "brw_fs.h" #include "main/uniforms.h" #include "glsl/nir/glsl_types.h" @@ -1085,11 +1086,33 @@ fs_visitor::fs_visitor(const struct brw_compiler *compiler, void *log_data, unsigned dispatch_width, int shader_time_index) : backend_shader(compiler, log_data, mem_ctx, shader, prog_data), - key(key), prog_data(prog_data), prog(prog), + key(key), gs_compile(NULL), prog_data(prog_data), prog(prog), dispatch_width(dispatch_width), shader_time_index(shader_time_index), - promoted_constants(0), bld(fs_builder(this, dispatch_width).at_end()) +{ + init(); +} + +fs_visitor::fs_visitor(const struct brw_compiler *compiler, void *log_data, + void *mem_ctx, + struct brw_gs_compile *c, + struct brw_gs_prog_data *prog_data, + const nir_shader *shader) + : backend_shader(compiler, log_data, mem_ctx, shader, + &prog_data->base.base), + key(&c->key), gs_compile(c), + prog_data(&prog_data->base.base), prog(NULL), + dispatch_width(8), + shader_time_index(ST_GS), + bld(fs_builder(this, dispatch_width).at_end()) +{ + init(); +} + + +void +fs_visitor::init() { switch (stage) { case MESA_SHADER_FRAGMENT: @@ -1108,6 +1131,8 @@ fs_visitor::fs_visitor(const struct brw_compiler *compiler, void *log_data, unreachable("unhandled shader stage"); } + this->prog_data = this->stage_prog_data; + this->failed = false; this->simd16_unsupported = false; this->no16_msg = NULL; @@ -1133,6 +1158,8 @@ fs_visitor::fs_visitor(const struct brw_compiler *compiler, void *log_data, this->pull_constant_loc = NULL; this->push_constant_loc = NULL; + this->promoted_constants = 0, + this->spilled_any_registers = false; this->do_dual_src = false;