On Thu, Oct 20, 2016 at 8:23 PM, Timothy Arceri < timothy.arc...@collabora.com> wrote:
> Here brw_setup_vue_interpolation() is rewritten not to use the > InterpQualifier > array in gl_fragment_program which will allow us to remove it. > > This change also makes the code which is only used by gen4/5 more self > contained > as it now has its own gen5_fragment_program struct rather than storing the > map > in brw_context. This means the interpolation map will only get processed > once > and will get stored in the in memory cache rather than being processed > everytime > the fs changes. > > Also by calling this from the fs compile code rather than from the upload > code > and using the interpolation assigned there we can get rid of the > BRW_NEW_INTERPOLATION_MAP flag. > > It might not seem ideal to add a gen5_fragment_program struct however by > the end > of this series we will have gotten rid of all the > brw_{shader_stage}_program > structs and replaced them with a generic brw_program struct so there will > only > be two program structs which is better than what we have now. > > V2: Don't remove BRW_NEW_INTERPOLATION_MAP from dirty_bit_map until the > following > patch to fix build error. > --- > src/intel/blorp/blorp.c | 6 +- > src/intel/vulkan/anv_pipeline.c | 2 +- > src/mesa/drivers/dri/i965/brw_clip.c | 19 ++--- > src/mesa/drivers/dri/i965/brw_clip.h | 7 +- > src/mesa/drivers/dri/i965/brw_clip_line.c | 2 +- > src/mesa/drivers/dri/i965/brw_clip_tri.c | 2 +- > src/mesa/drivers/dri/i965/brw_clip_unfilled.c | 2 +- > src/mesa/drivers/dri/i965/brw_clip_util.c | 10 +-- > src/mesa/drivers/dri/i965/brw_compiler.h | 8 ++- > src/mesa/drivers/dri/i965/brw_context.h | 45 ++++-------- > src/mesa/drivers/dri/i965/brw_fs.cpp | 4 +- > src/mesa/drivers/dri/i965/brw_interpolation_map.c | 85 > +++++++++++------------ > src/mesa/drivers/dri/i965/brw_nir.c | 7 +- > src/mesa/drivers/dri/i965/brw_nir.h | 3 +- > src/mesa/drivers/dri/i965/brw_program.c | 10 ++- > src/mesa/drivers/dri/i965/brw_sf.c | 14 ++-- > src/mesa/drivers/dri/i965/brw_sf.h | 4 +- > src/mesa/drivers/dri/i965/brw_sf_emit.c | 12 ++-- > src/mesa/drivers/dri/i965/brw_state.h | 3 - > src/mesa/drivers/dri/i965/brw_state_upload.c | 5 +- > src/mesa/drivers/dri/i965/brw_wm.c | 18 +++-- > src/mesa/drivers/dri/i965/brw_wm.h | 3 +- > 22 files changed, 142 insertions(+), 129 deletions(-) > > diff --git a/src/intel/blorp/blorp.c b/src/intel/blorp/blorp.c > index 5209ee2..8905cfa 100644 > --- a/src/intel/blorp/blorp.c > +++ b/src/intel/blorp/blorp.c > @@ -211,9 +211,9 @@ brw_blorp_compile_nir_shader(struct blorp_context > *blorp, struct nir_shader *nir > nir_lower_io(nir, nir_var_uniform, nir_uniform_type_size, 0); > > const unsigned *program = > - brw_compile_fs(compiler, blorp->driver_ctx, mem_ctx, > - wm_key, &wm_prog_data, nir, > - NULL, -1, -1, false, use_repclear, program_size, > NULL); > + brw_compile_fs(compiler, blorp->driver_ctx, mem_ctx, wm_key, > + &wm_prog_data, nir, NULL, -1, -1, false, > use_repclear, > + NULL, program_size, NULL); > > /* Copy the relavent bits of wm_prog_data over into the blorp prog > data */ > prog_data->dispatch_8 = wm_prog_data.dispatch_8; > diff --git a/src/intel/vulkan/anv_pipeline.c b/src/intel/vulkan/anv_ > pipeline.c > index 72f0643..0aac711 100644 > --- a/src/intel/vulkan/anv_pipeline.c > +++ b/src/intel/vulkan/anv_pipeline.c > @@ -678,7 +678,7 @@ anv_pipeline_compile_fs(struct anv_pipeline *pipeline, > unsigned code_size; > const unsigned *shader_code = > brw_compile_fs(compiler, NULL, mem_ctx, &key, &prog_data, nir, > - NULL, -1, -1, true, false, &code_size, NULL); > + NULL, -1, -1, true, false, NULL, &code_size, > NULL); > if (shader_code == NULL) { > ralloc_free(mem_ctx); > return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY); > diff --git a/src/mesa/drivers/dri/i965/brw_clip.c > b/src/mesa/drivers/dri/i965/brw_clip.c > index 1134fa4..06650b6 100644 > --- a/src/mesa/drivers/dri/i965/brw_clip.c > +++ b/src/mesa/drivers/dri/i965/brw_clip.c > @@ -68,11 +68,6 @@ static void compile_clip_prog( struct brw_context *brw, > c.key = *key; > c.vue_map = brw->vue_map_geom_out; > > - c.has_flat_shading = > - brw_any_flat_varyings(&key->interpolation_mode); > - c.has_noperspective_shading = > - brw_any_noperspective_varyings(&key->interpolation_mode); > - > /* nr_regs is the number of registers filled by reading data from the > VUE. > * This program accesses the entire VUE, so nr_regs needs to be the > size of > * the VUE (measured in pairs, since two slots are stored in each > @@ -144,7 +139,7 @@ brw_upload_clip_prog(struct brw_context *brw) > _NEW_POLYGON | > _NEW_TRANSFORM, > BRW_NEW_BLORP | > - BRW_NEW_INTERPOLATION_MAP | > + BRW_NEW_FRAGMENT_PROGRAM | > BRW_NEW_REDUCED_PRIMITIVE | > BRW_NEW_VUE_MAP_GEOM_OUT)) > return; > @@ -154,8 +149,16 @@ brw_upload_clip_prog(struct brw_context *brw) > /* Populate the key: > */ > > - /* BRW_NEW_INTERPOLATION_MAP */ > - key.interpolation_mode = brw->interpolation_mode; > + const struct gl_fragment_program *fprog = brw->fragment_program; > + if (fprog) { > + assert(brw->gen < 6); > + struct gen5_fragment_program *p = (struct gen5_fragment_program *) > fprog; > + > + /* BRW_NEW_FRAGMENT_PROGRAM */ > + key.contains_flat_varying = p->contains_flat_varying; > + key.contains_noperspective_varying = p->contains_noperspective_ > varying; > + key.interp_mode = p->interp_mode; > + } > > /* BRW_NEW_REDUCED_PRIMITIVE */ > key.primitive = brw->reduced_primitive; > diff --git a/src/mesa/drivers/dri/i965/brw_clip.h > b/src/mesa/drivers/dri/i965/brw_clip.h > index 54c7682..355ae64 100644 > --- a/src/mesa/drivers/dri/i965/brw_clip.h > +++ b/src/mesa/drivers/dri/i965/brw_clip.h > @@ -47,7 +47,9 @@ > */ > struct brw_clip_prog_key { > GLbitfield64 attrs; > - struct interpolation_mode_map interpolation_mode; > + bool contains_flat_varying; > + bool contains_noperspective_varying; > + unsigned char *interp_mode; > GLuint primitive:4; > GLuint nr_userclip:4; > GLuint pv_first:1; > @@ -128,9 +130,6 @@ struct brw_clip_compile { > bool need_direction; > > struct brw_vue_map vue_map; > - > - bool has_flat_shading; > - bool has_noperspective_shading; > }; > > /** > diff --git a/src/mesa/drivers/dri/i965/brw_clip_line.c > b/src/mesa/drivers/dri/i965/brw_clip_line.c > index 2c7f85a..f9cabd2 100644 > --- a/src/mesa/drivers/dri/i965/brw_clip_line.c > +++ b/src/mesa/drivers/dri/i965/brw_clip_line.c > @@ -302,7 +302,7 @@ void brw_emit_line_clip( struct brw_clip_compile *c ) > brw_clip_line_alloc_regs(c); > brw_clip_init_ff_sync(c); > > - if (c->has_flat_shading) { > + if (c->key.contains_flat_varying) { > if (c->key.pv_first) > brw_clip_copy_flatshaded_attributes(c, 1, 0); > else > diff --git a/src/mesa/drivers/dri/i965/brw_clip_tri.c > b/src/mesa/drivers/dri/i965/brw_clip_tri.c > index 4caa8f5..52402e3 100644 > --- a/src/mesa/drivers/dri/i965/brw_clip_tri.c > +++ b/src/mesa/drivers/dri/i965/brw_clip_tri.c > @@ -650,7 +650,7 @@ void brw_emit_tri_clip( struct brw_clip_compile *c ) > * flatshading, need to apply the flatshade here because we don't > * respect the PV when converting to trifan for emit: > */ > - if (c->has_flat_shading) > + if (c->key.contains_flat_varying) > brw_clip_tri_flat_shade(c); > > if ((c->key.clip_mode == BRW_CLIPMODE_NORMAL) || > diff --git a/src/mesa/drivers/dri/i965/brw_clip_unfilled.c > b/src/mesa/drivers/dri/i965/brw_clip_unfilled.c > index d333d10..7c06857 100644 > --- a/src/mesa/drivers/dri/i965/brw_clip_unfilled.c > +++ b/src/mesa/drivers/dri/i965/brw_clip_unfilled.c > @@ -519,7 +519,7 @@ void brw_emit_unfilled_clip( struct brw_clip_compile > *c ) > > /* Need to do this whether we clip or not: > */ > - if (c->has_flat_shading) > + if (c->key.contains_flat_varying) > brw_clip_tri_flat_shade(c); > > brw_clip_init_clipmask(c); > diff --git a/src/mesa/drivers/dri/i965/brw_clip_util.c > b/src/mesa/drivers/dri/i965/brw_clip_util.c > index f5d0a5a..4f1b0fd 100644 > --- a/src/mesa/drivers/dri/i965/brw_clip_util.c > +++ b/src/mesa/drivers/dri/i965/brw_clip_util.c > @@ -157,7 +157,7 @@ void brw_clip_interp_vertex( struct brw_clip_compile > *c, > */ > > /* Take a copy of the v0 NDC coordinates, in case dest == v0. */ > - if (c->has_noperspective_shading) { > + if (c->key.contains_noperspective_varying) { > GLuint offset = brw_varying_to_offset(&c->vue_map, > BRW_VARYING_SLOT_NDC); > v0_ndc_copy = get_tmp(c); > @@ -183,7 +183,7 @@ void brw_clip_interp_vertex( struct brw_clip_compile > *c, > /* If we have noperspective attributes, > * we need to compute the screen-space t > */ > - if (c->has_noperspective_shading) { > + if (c->key.contains_noperspective_varying) { > GLuint delta = brw_varying_to_offset(&c->vue_map, > BRW_VARYING_SLOT_NDC); > struct brw_reg tmp = get_tmp(c); > @@ -272,7 +272,7 @@ void brw_clip_interp_vertex( struct brw_clip_compile > *c, > * Unless the attribute is flat shaded -- in which case just copy > * from one of the sources (doesn't matter which; already copied > from pv) > */ > - GLuint interp = c->key.interpolation_mode.mode[slot]; > + GLuint interp = c->key.interp_mode[slot]; > > if (interp != INTERP_MODE_FLAT) { > struct brw_reg tmp = get_tmp(c); > @@ -310,7 +310,7 @@ void brw_clip_interp_vertex( struct brw_clip_compile > *c, > brw_MOV(p, deref_4f(dest_ptr, delta), brw_imm_f(0)); > } > > - if (c->has_noperspective_shading) > + if (c->key.contains_noperspective_varying) > release_tmp(c, t_nopersp); > } > > @@ -406,7 +406,7 @@ void brw_clip_copy_flatshaded_attributes( struct > brw_clip_compile *c, > struct brw_codegen *p = &c->func; > > for (int i = 0; i < c->vue_map.num_slots; i++) { > - if (c->key.interpolation_mode.mode[i] == INTERP_MODE_FLAT) { > + if (c->key.interp_mode[i] == INTERP_MODE_FLAT) { > brw_MOV(p, > byte_offset(c->reg.vertex[to], > brw_vue_slot_to_offset(i)), > byte_offset(c->reg.vertex[from], > brw_vue_slot_to_offset(i))); > diff --git a/src/mesa/drivers/dri/i965/brw_compiler.h > b/src/mesa/drivers/dri/i965/brw_compiler.h > index 447d05b..772c11e 100644 > --- a/src/mesa/drivers/dri/i965/brw_compiler.h > +++ b/src/mesa/drivers/dri/i965/brw_compiler.h > @@ -575,6 +575,12 @@ void brw_compute_tess_vue_map(struct brw_vue_map > *const vue_map, > const GLbitfield64 slots_valid, > const GLbitfield is_patch); > > +/* brw_interpolation_map.c */ > +void brw_setup_vue_interpolation(struct brw_vue_map *vue_map, > + struct nir_shader *nir, > + struct gl_program *prog, > + const struct gen_device_info *devinfo); > + > enum shader_dispatch_mode { > DISPATCH_MODE_4X1_SINGLE = 0, > DISPATCH_MODE_4X2_DUAL_INSTANCE = 1, > @@ -834,7 +840,7 @@ brw_compile_fs(const struct brw_compiler *compiler, > void *log_data, > int shader_time_index8, > int shader_time_index16, > bool allow_spilling, > - bool use_rep_send, > + bool use_rep_send, struct brw_vue_map *vue_map, > unsigned *final_assembly_size, > char **error_str); > > diff --git a/src/mesa/drivers/dri/i965/brw_context.h > b/src/mesa/drivers/dri/i965/brw_context.h > index e190d53..ba8b254 100644 > --- a/src/mesa/drivers/dri/i965/brw_context.h > +++ b/src/mesa/drivers/dri/i965/brw_context.h > @@ -363,6 +363,20 @@ struct brw_fragment_program { > }; > > > +struct gen5_fragment_program { > + struct brw_fragment_program base; > + > + bool contains_flat_varying; > + bool contains_noperspective_varying; > + > + /* > + * Mapping of varying slots to interpolation modes. > + * Used Gen4/5 by the clip|sf|wm stages. > + */ > + unsigned char interp_mode[BRW_VARYING_SLOT_COUNT]; > +}; > + > + > /** Subclass of Mesa compute program */ > struct brw_compute_program { > struct gl_program program; > @@ -385,32 +399,6 @@ struct brw_shader { > ~VARYING_BIT_POS & ~VARYING_BIT_FACE) > > > -/* > - * Mapping of VUE map slots to interpolation modes. > - */ > -struct interpolation_mode_map { > - unsigned char mode[BRW_VARYING_SLOT_COUNT]; > -}; > - > -static inline bool brw_any_flat_varyings(struct interpolation_mode_map > *map) > -{ > - for (int i = 0; i < BRW_VARYING_SLOT_COUNT; i++) > - if (map->mode[i] == INTERP_MODE_FLAT) > - return true; > - > - return false; > -} > - > -static inline bool brw_any_noperspective_varyings(struct > interpolation_mode_map *map) > -{ > - for (int i = 0; i < BRW_VARYING_SLOT_COUNT; i++) > - if (map->mode[i] == INTERP_MODE_NOPERSPECTIVE) > - return true; > - > - return false; > -} > - > - > struct brw_sf_prog_data { > GLuint urb_read_length; > GLuint total_grf; > @@ -1273,11 +1261,6 @@ struct brw_context > uint32_t render_target_format[MESA_FORMAT_COUNT]; > bool format_supported_as_render_target[MESA_FORMAT_COUNT]; > > - /* Interpolation modes, one byte per vue slot. > - * Used Gen4/5 by the clip|sf|wm stages. Ignored on Gen6+. > - */ > - struct interpolation_mode_map interpolation_mode; > - > /* PrimitiveRestart */ > struct { > bool in_progress; > diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp > b/src/mesa/drivers/dri/i965/brw_fs.cpp > index 1a22fb4..3e0d057 100644 > --- a/src/mesa/drivers/dri/i965/brw_fs.cpp > +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp > @@ -6422,14 +6422,14 @@ brw_compile_fs(const struct brw_compiler > *compiler, void *log_data, > struct gl_program *prog, > int shader_time_index8, int shader_time_index16, > bool allow_spilling, > - bool use_rep_send, > + bool use_rep_send, struct brw_vue_map *vue_map, > unsigned *final_assembly_size, > char **error_str) > { > nir_shader *shader = nir_shader_clone(mem_ctx, src_shader); > shader = brw_nir_apply_sampler_key(shader, compiler->devinfo, > &key->tex, > true); > - brw_nir_lower_fs_inputs(shader, compiler->devinfo, key); > + brw_nir_lower_fs_inputs(shader, vue_map, prog, compiler->devinfo, > key); > brw_nir_lower_fs_outputs(shader); > if (!key->multisample_fbo) > NIR_PASS_V(shader, demote_sample_qualifiers); > diff --git a/src/mesa/drivers/dri/i965/brw_interpolation_map.c > b/src/mesa/drivers/dri/i965/brw_interpolation_map.c > index 097987b..cb4deb5 100644 > --- a/src/mesa/drivers/dri/i965/brw_interpolation_map.c > +++ b/src/mesa/drivers/dri/i965/brw_interpolation_map.c > @@ -21,7 +21,8 @@ > * IN THE SOFTWARE. > */ > > -#include "brw_state.h" > +#include "brw_compiler.h" > +#include "brw_context.h" > #include "compiler/nir/nir.h" > > static char const *get_qual_name(int mode) > @@ -38,58 +39,52 @@ static char const *get_qual_name(int mode) > > /* Set up interpolation modes for every element in the VUE */ > void > -brw_setup_vue_interpolation(struct brw_context *brw) > +brw_setup_vue_interpolation(struct brw_vue_map *vue_map, nir_shader *nir, > + struct gl_program *prog, > + const struct gen_device_info *devinfo) > { > - const struct gl_fragment_program *fprog = brw->fragment_program; > - struct brw_vue_map *vue_map = &brw->vue_map_geom_out; > + struct gen5_fragment_program *fprog = (struct gen5_fragment_program *) > prog; > Why are we calling this gen5_fragment_program and not gen4_fragment_program? Generally, we use the lowest gen that applies. > - if (!brw_state_dirty(brw, > - _NEW_LIGHT, > - BRW_NEW_BLORP | > - BRW_NEW_FRAGMENT_PROGRAM | > - BRW_NEW_VUE_MAP_GEOM_OUT)) > - return; > - > - memset(&brw->interpolation_mode, INTERP_MODE_NONE, > sizeof(brw->interpolation_mode)); > - > - brw->ctx.NewDriverState |= BRW_NEW_INTERPOLATION_MAP; > + memset(fprog->interp_mode, INTERP_MODE_NONE, > sizeof(fprog->interp_mode)); > Please, no. This does not do what it looks like it does. Most enums (unless declared as packed) aren't compiled down to 8-bit types so the only reason why this works is because INTERP_MODE_NONE happens to be 0. If it was anything else, this line wouldn't work. Memset to 0 with a comment or use a for loop; don't memset to an enum value. > > - if (!fprog) > + if (!vue_map) > return; > > - for (int i = 0; i < vue_map->num_slots; i++) { > - int varying = vue_map->slot_to_varying[i]; > - if (varying == -1) > - continue; > + /* HPOS always wants noperspective. setting it up here allows > + * us to not need special handling in the SF program. > + */ > + unsigned pos_slot = vue_map->varying_to_slot[VARYING_SLOT_POS]; > + if (pos_slot != -1) {; > + fprog->interp_mode[pos_slot] = INTERP_MODE_NOPERSPECTIVE; > + fprog->contains_noperspective_varying = true; > + } > > - /* HPOS always wants noperspective. setting it up here allows > - * us to not need special handling in the SF program. */ > - if (varying == VARYING_SLOT_POS) { > - brw->interpolation_mode.mode[i] = INTERP_MODE_NOPERSPECTIVE; > - continue; > + foreach_list_typed(nir_variable, var, node, &nir->inputs) { > + unsigned location = var->data.location; > + unsigned slot_count = glsl_count_attribute_slots(var->type, false); > + unsigned remap_count = 1; > + if (location == VARYING_SLOT_COL0 || location == VARYING_SLOT_COL1) > { > + remap_count = 2; > } > > - int frag_attrib = varying; > - if (varying == VARYING_SLOT_BFC0 || varying == VARYING_SLOT_BFC1) > - frag_attrib = varying - VARYING_SLOT_BFC0 + VARYING_SLOT_COL0; > - > - if (!(fprog->Base.nir->info->inputs_read & > BITFIELD64_BIT(frag_attrib))) > - continue; > - > - enum glsl_interp_mode mode = fprog->InterpQualifier[frag_attrib]; > - > - /* If the mode is not specified, the default varies: Color values > - * follow GL_SHADE_MODEL; everything else is smooth. > - */ > - if (mode == INTERP_MODE_NONE) { > - if (frag_attrib == VARYING_SLOT_COL0 || frag_attrib == > VARYING_SLOT_COL1) > - mode = brw->ctx.Light.ShadeModel == GL_FLAT > - ? INTERP_MODE_FLAT : INTERP_MODE_SMOOTH; > - else > - mode = INTERP_MODE_SMOOTH; > Uh... Where did this logic go? Oh, it's already in nir_lower_fs_inputs... > + for (unsigned j = 0; j < remap_count; j++) { > This remap thing is really confusing. Maybe it would be better to have a helper gen5_fragment_prog_set_interp_modes(prog, vue_map, location, slot_count, interp_mode) And then, you can explicitly call it twice for colors and once for other things. I believe your logic here is correct, it's just horribly confusing. > + if (j == 1) > + location = location + VARYING_SLOT_BFC0 - VARYING_SLOT_COL0; > + > + for (unsigned k = 0; k < slot_count; k++) { > + unsigned slot = vue_map->varying_to_slot[location + k]; > + if (slot != -1 && fprog->interp_mode[slot] == > INTERP_MODE_NONE) { > + fprog->interp_mode[slot] = var->data.interpolation; > + > + if (fprog->interp_mode[slot] == INTERP_MODE_FLAT) { > + fprog->contains_flat_varying = true; > + } else if (fprog->interp_mode[slot] == > + INTERP_MODE_NOPERSPECTIVE) { > + fprog->contains_noperspective_varying = true; > + } > + } > + } > } > - > - brw->interpolation_mode.mode[i] = mode; > } > > if (unlikely(INTEL_DEBUG & DEBUG_VUE)) { > @@ -103,7 +98,7 @@ brw_setup_vue_interpolation(struct brw_context *brw) > > fprintf(stderr, "%d: %d %s ofs %d\n", > i, varying, > - get_qual_name(brw->interpolation_mode.mode[i]), > + get_qual_name(fprog->interp_mode[i]), > brw_vue_slot_to_offset(i)); > } > } > diff --git a/src/mesa/drivers/dri/i965/brw_nir.c > b/src/mesa/drivers/dri/i965/brw_nir.c > index 3d19691..e6566ba 100644 > --- a/src/mesa/drivers/dri/i965/brw_nir.c > +++ b/src/mesa/drivers/dri/i965/brw_nir.c > @@ -280,7 +280,8 @@ brw_nir_lower_tes_inputs(nir_shader *nir, const > struct brw_vue_map *vue_map) > } > > void > -brw_nir_lower_fs_inputs(nir_shader *nir, > +brw_nir_lower_fs_inputs(nir_shader *nir, struct brw_vue_map *vue_map, > + struct gl_program *prog, > const struct gen_device_info *devinfo, > const struct brw_wm_prog_key *key) > { > @@ -311,6 +312,10 @@ brw_nir_lower_fs_inputs(nir_shader *nir, > } > } > > + if (devinfo->gen < 6) { > This is a lie. It really needs to be (devinfo->gen < 6 && prog). Or, you could assert prog. Something to indicate that prog can't be null here. > + brw_setup_vue_interpolation(vue_map, nir, prog, devinfo); > + } > + > nir_lower_io_options lower_io_options = 0; > if (key->persample_interp) > lower_io_options |= nir_lower_io_force_sample_interpolation; > diff --git a/src/mesa/drivers/dri/i965/brw_nir.h > b/src/mesa/drivers/dri/i965/brw_nir.h > index aef5c53..f989026 100644 > --- a/src/mesa/drivers/dri/i965/brw_nir.h > +++ b/src/mesa/drivers/dri/i965/brw_nir.h > @@ -105,7 +105,8 @@ void brw_nir_lower_vs_inputs(nir_shader *nir, > void brw_nir_lower_vue_inputs(nir_shader *nir, bool is_scalar, > const struct brw_vue_map *vue_map); > void brw_nir_lower_tes_inputs(nir_shader *nir, const struct brw_vue_map > *vue); > -void brw_nir_lower_fs_inputs(nir_shader *nir, > +void brw_nir_lower_fs_inputs(nir_shader *nir, struct brw_vue_map > *vue_map, > + struct gl_program *prog, > const struct gen_device_info *devinfo, > const struct brw_wm_prog_key *key); > void brw_nir_lower_vue_outputs(nir_shader *nir, bool is_scalar); > diff --git a/src/mesa/drivers/dri/i965/brw_program.c > b/src/mesa/drivers/dri/i965/brw_program.c > index 7516baf..957c5b5 100644 > --- a/src/mesa/drivers/dri/i965/brw_program.c > +++ b/src/mesa/drivers/dri/i965/brw_program.c > @@ -142,7 +142,15 @@ static struct gl_program *brwNewProgram( struct > gl_context *ctx, > } > > case GL_FRAGMENT_PROGRAM_ARB: { > - struct brw_fragment_program *prog = CALLOC_STRUCT(brw_fragment_ > program); > + struct brw_fragment_program *prog; > + if (brw->gen < 6) { > + struct gen5_fragment_program *g5_prog = > + CALLOC_STRUCT(gen5_fragment_program); > + prog = &g5_prog->base; > + } else { > + prog = CALLOC_STRUCT(brw_fragment_program); > + } > + > if (prog) { > prog->id = get_new_program_id(brw->screen); > > diff --git a/src/mesa/drivers/dri/i965/brw_sf.c > b/src/mesa/drivers/dri/i965/brw_sf.c > index 094260e..308b056 100644 > --- a/src/mesa/drivers/dri/i965/brw_sf.c > +++ b/src/mesa/drivers/dri/i965/brw_sf.c > @@ -79,7 +79,6 @@ static void compile_sf_prog( struct brw_context *brw, > > c.prog_data.urb_read_length = c.nr_attr_regs; > c.prog_data.urb_entry_size = c.nr_setup_regs * 2; > - c.has_flat_shading = brw_any_flat_varyings(&key->interpolation_mode); > > /* Which primitive? Or all three? > */ > @@ -148,7 +147,7 @@ brw_upload_sf_prog(struct brw_context *brw) > _NEW_PROGRAM | > _NEW_TRANSFORM, > BRW_NEW_BLORP | > - BRW_NEW_INTERPOLATION_MAP | > + BRW_NEW_FRAGMENT_PROGRAM | > BRW_NEW_REDUCED_PRIMITIVE | > BRW_NEW_VUE_MAP_GEOM_OUT)) > return; > @@ -204,8 +203,15 @@ brw_upload_sf_prog(struct brw_context *brw) > if ((ctx->Point.SpriteOrigin == GL_LOWER_LEFT) != render_to_fbo) > key.sprite_origin_lower_left = true; > > - /* BRW_NEW_INTERPOLATION_MAP */ > - key.interpolation_mode = brw->interpolation_mode; > + const struct gl_fragment_program *fprog = brw->fragment_program; > + if (fprog) { > + assert(brw->gen < 6); > + struct gen5_fragment_program *p = (struct gen5_fragment_program *) > fprog; > + > + /* BRW_NEW_FRAGMENT_PROGRAM */ > + key.contains_flat_varying = p->contains_flat_varying; > + key.interp_mode = p->interp_mode; > + } > > /* _NEW_LIGHT | _NEW_PROGRAM */ > key.do_twoside_color = ((ctx->Light.Enabled && > ctx->Light.Model.TwoSide) || > diff --git a/src/mesa/drivers/dri/i965/brw_sf.h > b/src/mesa/drivers/dri/i965/brw_sf.h > index 15102ac..ce4b2e3 100644 > --- a/src/mesa/drivers/dri/i965/brw_sf.h > +++ b/src/mesa/drivers/dri/i965/brw_sf.h > @@ -46,7 +46,8 @@ > > struct brw_sf_prog_key { > GLbitfield64 attrs; > - struct interpolation_mode_map interpolation_mode; > + bool contains_flat_varying; > + unsigned char *interp_mode; > uint8_t point_sprite_coord_replace; > GLuint primitive:2; > GLuint do_twoside_color:1; > @@ -98,7 +99,6 @@ struct brw_sf_compile { > unsigned flag_value; > > struct brw_vue_map vue_map; > - bool has_flat_shading; > }; > > > diff --git a/src/mesa/drivers/dri/i965/brw_sf_emit.c > b/src/mesa/drivers/dri/i965/brw_sf_emit.c > index fe05d54..5f31fa5 100644 > --- a/src/mesa/drivers/dri/i965/brw_sf_emit.c > +++ b/src/mesa/drivers/dri/i965/brw_sf_emit.c > @@ -162,7 +162,7 @@ static void copy_flatshaded_attributes(struct > brw_sf_compile *c, > int i; > > for (i = 0; i < c->vue_map.num_slots; i++) { > - if (c->key.interpolation_mode.mode[i] == INTERP_MODE_FLAT) { > + if (c->key.interp_mode[i] == INTERP_MODE_FLAT) { > brw_MOV(p, > get_vue_slot(c, dst, i), > get_vue_slot(c, src, i)); > @@ -176,7 +176,7 @@ static int count_flatshaded_attributes(struct > brw_sf_compile *c) > int count = 0; > > for (i = 0; i < c->vue_map.num_slots; i++) > - if (c->key.interpolation_mode.mode[i] == INTERP_MODE_FLAT) > + if (c->key.interp_mode[i] == INTERP_MODE_FLAT) > count++; > > return count; > @@ -342,7 +342,7 @@ calculate_masks(struct brw_sf_compile *c, > *pc_linear = 0; > *pc = 0xf; > > - interp = c->key.interpolation_mode.mode[vert_reg_to_vue_slot(c, reg, > 0)]; > + interp = c->key.interp_mode[vert_reg_to_vue_slot(c, reg, 0)]; > if (interp == INTERP_MODE_SMOOTH) { > *pc_linear = 0xf; > *pc_persp = 0xf; > @@ -354,7 +354,7 @@ calculate_masks(struct brw_sf_compile *c, > if (vert_reg_to_varying(c, reg, 1) != BRW_VARYING_SLOT_COUNT) { > *pc |= 0xf0; > > - interp = c->key.interpolation_mode.mode[vert_reg_to_vue_slot(c, > reg, 1)]; > + interp = c->key.interp_mode[vert_reg_to_vue_slot(c, reg, 1)]; > if (interp == INTERP_MODE_SMOOTH) { > *pc_linear |= 0xf0; > *pc_persp |= 0xf0; > @@ -428,7 +428,7 @@ void brw_emit_tri_setup(struct brw_sf_compile *c, bool > allocate) > if (c->key.do_twoside_color) > do_twoside_color(c); > > - if (c->has_flat_shading) > + if (c->key.contains_flat_varying) > do_flatshade_triangle(c); > > > @@ -514,7 +514,7 @@ void brw_emit_line_setup(struct brw_sf_compile *c, > bool allocate) > invert_det(c); > copy_z_inv_w(c); > > - if (c->has_flat_shading) > + if (c->key.contains_flat_varying) > do_flatshade_line(c); > > for (i = 0; i < c->nr_setup_regs; i++) > diff --git a/src/mesa/drivers/dri/i965/brw_state.h > b/src/mesa/drivers/dri/i965/brw_state.h > index b42b9af..1420aab 100644 > --- a/src/mesa/drivers/dri/i965/brw_state.h > +++ b/src/mesa/drivers/dri/i965/brw_state.h > @@ -396,9 +396,6 @@ void gen7_enable_hw_binding_tables(struct brw_context > *brw); > void gen7_disable_hw_binding_tables(struct brw_context *brw); > void gen7_reset_hw_bt_pool_offsets(struct brw_context *brw); > > -/* brw_interpolation_map.c */ > -void brw_setup_vue_interpolation(struct brw_context *brw); > - > /* brw_clip.c */ > void brw_upload_clip_prog(struct brw_context *brw); > > diff --git a/src/mesa/drivers/dri/i965/brw_state_upload.c > b/src/mesa/drivers/dri/i965/brw_state_upload.c > index 17d1b2d..17befe3 100644 > --- a/src/mesa/drivers/dri/i965/brw_state_upload.c > +++ b/src/mesa/drivers/dri/i965/brw_state_upload.c > @@ -734,13 +734,12 @@ brw_upload_programs(struct brw_context *brw, > ctx->Const.MaxViewports : 1; > } > > + brw_upload_wm_prog(brw); > + > if (brw->gen < 6) { > - brw_setup_vue_interpolation(brw); > brw_upload_clip_prog(brw); > brw_upload_sf_prog(brw); > } > - > - brw_upload_wm_prog(brw); > } else if (pipeline == BRW_COMPUTE_PIPELINE) { > brw_upload_cs_prog(brw); > } > diff --git a/src/mesa/drivers/dri/i965/brw_wm.c > b/src/mesa/drivers/dri/i965/brw_wm.c > index e65f77a..53b7d9b 100644 > --- a/src/mesa/drivers/dri/i965/brw_wm.c > +++ b/src/mesa/drivers/dri/i965/brw_wm.c > @@ -77,7 +77,8 @@ bool > brw_codegen_wm_prog(struct brw_context *brw, > struct gl_shader_program *prog, > struct brw_fragment_program *fp, > - struct brw_wm_prog_key *key) > + struct brw_wm_prog_key *key, > + struct brw_vue_map *vue_map) > { > const struct gen_device_info *devinfo = &brw->screen->devinfo; > struct gl_context *ctx = &brw->ctx; > @@ -146,8 +147,9 @@ brw_codegen_wm_prog(struct brw_context *brw, > program = brw_compile_fs(brw->screen->compiler, brw, mem_ctx, > key, &prog_data, fp->program.Base.nir, > &fp->program.Base, st_index8, st_index16, > - true, brw->use_rep_send, > + true, brw->use_rep_send, vue_map, > &program_size, &error_str); > + > if (program == NULL) { > if (prog) { > prog->LinkStatus = false; > @@ -587,7 +589,8 @@ brw_upload_wm_prog(struct brw_context *brw) > &key, sizeof(key), > &brw->wm.base.prog_offset, > &brw->wm.base.prog_data)) { > - bool success = brw_codegen_wm_prog(brw, current, fp, &key); > + bool success = brw_codegen_wm_prog(brw, current, fp, &key, > + &brw->vue_map_geom_out); > (void) success; > assert(success); > } > @@ -641,7 +644,14 @@ brw_fs_precompile(struct gl_context *ctx, > uint32_t old_prog_offset = brw->wm.base.prog_offset; > struct brw_stage_prog_data *old_prog_data = brw->wm.base.prog_data; > > - bool success = brw_codegen_wm_prog(brw, shader_prog, bfp, &key); > + struct brw_vue_map vue_map; > + if (brw->gen < 6) { > + brw_compute_vue_map(&brw->screen->devinfo, &vue_map, > + fp->Base.nir->info->inputs_read | > VARYING_BIT_POS, > + false); > + } > + > + bool success = brw_codegen_wm_prog(brw, shader_prog, bfp, &key, > &vue_map); > > brw->wm.base.prog_offset = old_prog_offset; > brw->wm.base.prog_data = old_prog_data; > diff --git a/src/mesa/drivers/dri/i965/brw_wm.h > b/src/mesa/drivers/dri/i965/brw_wm.h > index 8fa24b1..f4f513b 100644 > --- a/src/mesa/drivers/dri/i965/brw_wm.h > +++ b/src/mesa/drivers/dri/i965/brw_wm.h > @@ -63,7 +63,8 @@ bool brw_color_buffer_write_enabled(struct brw_context > *brw); > bool brw_codegen_wm_prog(struct brw_context *brw, > struct gl_shader_program *prog, > struct brw_fragment_program *fp, > - struct brw_wm_prog_key *key); > + struct brw_wm_prog_key *key, > + struct brw_vue_map *vue_map); > void brw_wm_debug_recompile(struct brw_context *brw, > struct gl_shader_program *prog, > const struct brw_wm_prog_key *key); > -- > 2.7.4 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev >
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev