In this commit, the function bodies of each of the brw_upload_<stage>_prog functions are manually inlined into brw_upload_programs. This commit is intended to have no functional change.
The resulting function body of brw_upload_programs is fairly messy, and is expected to be cleaned up by subsequent commits that continue the refactoring. --- src/mesa/drivers/dri/i965/brw_ff_gs.c | 37 +------- src/mesa/drivers/dri/i965/brw_ff_gs.h | 7 +- src/mesa/drivers/dri/i965/brw_gs.c | 59 +----------- src/mesa/drivers/dri/i965/brw_gs.h | 6 +- src/mesa/drivers/dri/i965/brw_state_upload.c | 129 +++++++++++++++++++++++++-- src/mesa/drivers/dri/i965/brw_vs.c | 43 +-------- src/mesa/drivers/dri/i965/brw_vs.h | 6 +- src/mesa/drivers/dri/i965/brw_wm.c | 31 +------ src/mesa/drivers/dri/i965/brw_wm.h | 6 +- 9 files changed, 153 insertions(+), 171 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_ff_gs.c b/src/mesa/drivers/dri/i965/brw_ff_gs.c index f72f37f..4c438e5 100644 --- a/src/mesa/drivers/dri/i965/brw_ff_gs.c +++ b/src/mesa/drivers/dri/i965/brw_ff_gs.c @@ -149,7 +149,7 @@ brw_codegen_ff_gs_prog(struct brw_context *brw, ralloc_free(mem_ctx); } -static bool +bool brw_ff_gs_state_dirty(struct brw_context *brw) { return brw_state_dirty(brw, @@ -159,7 +159,7 @@ brw_ff_gs_state_dirty(struct brw_context *brw) BRW_NEW_VS_PROG_DATA); } -static void +void brw_ff_gs_populate_key(struct brw_context *brw, struct brw_ff_gs_prog_key *key) { @@ -231,36 +231,3 @@ brw_ff_gs_populate_key(struct brw_context *brw, brw->primitive == _3DPRIM_LINELOOP); } } - -/* Calculate interpolants for triangle and line rasterization. - */ -void -brw_upload_ff_gs_prog(struct brw_context *brw) -{ - struct brw_ff_gs_prog_key key; - - if (!brw_ff_gs_state_dirty(brw)) - return; - - /* Populate the key: - */ - brw_ff_gs_populate_key(brw, &key); - - if (brw->ff_gs.prog_active != key.need_gs_prog) { - brw->ctx.NewDriverState |= BRW_NEW_FF_GS_PROG_DATA; - brw->ff_gs.prog_active = key.need_gs_prog; - } - - if (brw->ff_gs.prog_active) { - if (!brw_search_cache(&brw->cache, BRW_CACHE_FF_GS_PROG, - &key, sizeof(key), - &brw->ff_gs.prog_offset, &brw->ff_gs.prog_data)) { - brw_codegen_ff_gs_prog(brw, &key); - } - } -} - -void gen6_brw_upload_ff_gs_prog(struct brw_context *brw) -{ - brw_upload_ff_gs_prog(brw); -} diff --git a/src/mesa/drivers/dri/i965/brw_ff_gs.h b/src/mesa/drivers/dri/i965/brw_ff_gs.h index 9e016b8..dca6405 100644 --- a/src/mesa/drivers/dri/i965/brw_ff_gs.h +++ b/src/mesa/drivers/dri/i965/brw_ff_gs.h @@ -110,10 +110,13 @@ void brw_ff_gs_lines(struct brw_ff_gs_compile *c); void gen6_sol_program(struct brw_ff_gs_compile *c, struct brw_ff_gs_prog_key *key, unsigned num_verts, bool check_edge_flag); -void gen6_brw_upload_ff_gs_prog(struct brw_context *brw); + +bool +brw_ff_gs_state_dirty(struct brw_context *brw); void -brw_upload_ff_gs_prog(struct brw_context *brw); +brw_ff_gs_populate_key(struct brw_context *brw, + struct brw_ff_gs_prog_key *key); void brw_codegen_ff_gs_prog(struct brw_context *brw, diff --git a/src/mesa/drivers/dri/i965/brw_gs.c b/src/mesa/drivers/dri/i965/brw_gs.c index 52c7303..71765f9 100644 --- a/src/mesa/drivers/dri/i965/brw_gs.c +++ b/src/mesa/drivers/dri/i965/brw_gs.c @@ -290,7 +290,7 @@ brw_codegen_gs_prog(struct brw_context *brw, return true; } -static bool +bool brw_gs_state_dirty(struct brw_context *brw) { return brw_state_dirty(brw, @@ -300,7 +300,7 @@ brw_gs_state_dirty(struct brw_context *brw) BRW_NEW_VUE_MAP_VS); } -static void +void brw_gs_populate_key(struct brw_context *brw, struct brw_gs_prog_key *key) { @@ -324,61 +324,6 @@ brw_gs_populate_key(struct brw_context *brw, key->input_varyings = brw->vue_map_vs.slots_valid; } -void -brw_upload_gs_prog(struct brw_context *brw) -{ - struct gl_context *ctx = &brw->ctx; - struct gl_shader_program **current = ctx->_Shader->CurrentProgram; - struct brw_stage_state *stage_state = &brw->gs.base; - struct brw_gs_prog_key key; - /* BRW_NEW_GEOMETRY_PROGRAM */ - struct brw_geometry_program *gp = - (struct brw_geometry_program *) brw->geometry_program; - - if (!brw_gs_state_dirty(brw)) - return; - - if (gp == NULL) { - /* No geometry shader. Vertex data just passes straight through. */ - if (brw->ctx.NewDriverState & BRW_NEW_VUE_MAP_VS) { - brw->vue_map_geom_out = brw->vue_map_vs; - brw->ctx.NewDriverState |= BRW_NEW_VUE_MAP_GEOM_OUT; - } - - if (brw->gen == 6 && - (brw->ctx.NewDriverState & BRW_NEW_TRANSFORM_FEEDBACK)) { - gen6_brw_upload_ff_gs_prog(brw); - return; - } - - /* Other state atoms had better not try to access prog_data, since - * there's no GS program. - */ - brw->gs.prog_data = NULL; - brw->gs.base.prog_data = NULL; - - return; - } - - brw_gs_populate_key(brw, &key); - - if (!brw_search_cache(&brw->cache, BRW_CACHE_GS_PROG, - &key, sizeof(key), - &stage_state->prog_offset, &brw->gs.prog_data)) { - bool success = brw_codegen_gs_prog(brw, current[MESA_SHADER_GEOMETRY], - gp, &key); - assert(success); - (void)success; - } - brw->gs.base.prog_data = &brw->gs.prog_data->base.base; - - if (memcmp(&brw->gs.prog_data->base.vue_map, &brw->vue_map_geom_out, - sizeof(brw->vue_map_geom_out)) != 0) { - brw->vue_map_geom_out = brw->gs.prog_data->base.vue_map; - brw->ctx.NewDriverState |= BRW_NEW_VUE_MAP_GEOM_OUT; - } -} - bool brw_gs_precompile(struct gl_context *ctx, struct gl_shader_program *shader_prog, diff --git a/src/mesa/drivers/dri/i965/brw_gs.h b/src/mesa/drivers/dri/i965/brw_gs.h index b327c40..a484e4b 100644 --- a/src/mesa/drivers/dri/i965/brw_gs.h +++ b/src/mesa/drivers/dri/i965/brw_gs.h @@ -39,8 +39,12 @@ struct gl_program; bool brw_gs_prog_data_compare(const void *a, const void *b); +bool +brw_gs_state_dirty(struct brw_context *brw); + void -brw_upload_gs_prog(struct brw_context *brw); +brw_gs_populate_key(struct brw_context *brw, + struct brw_gs_prog_key *key); bool brw_codegen_gs_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 84b0861..7fa434f 100644 --- a/src/mesa/drivers/dri/i965/brw_state_upload.c +++ b/src/mesa/drivers/dri/i965/brw_state_upload.c @@ -619,15 +619,132 @@ static inline void brw_upload_programs(struct brw_context *brw, enum brw_pipeline pipeline) { + struct gl_context *ctx = &brw->ctx; + struct gl_shader_program **current = ctx->_Shader->CurrentProgram; + struct gl_shader_program *current_fp = ctx->_Shader->_CurrentFragmentProgram; + struct brw_vs_prog_key vs_key; + struct brw_ff_gs_prog_key ff_gs_key; + struct brw_gs_prog_key gs_key; + struct brw_wm_prog_key wm_key; + struct brw_stage_state *stage_state = &brw->gs.base; + struct brw_vertex_program *vp = + (struct brw_vertex_program *) brw->vertex_program; + struct brw_geometry_program *gp = + (struct brw_geometry_program *) brw->geometry_program; + struct brw_fragment_program *fp = + (struct brw_fragment_program *) brw->fragment_program; + if (pipeline == BRW_RENDER_PIPELINE) { - brw_upload_vs_prog(brw); - if (brw->gen < 6) - brw_upload_ff_gs_prog(brw); - else - brw_upload_gs_prog(brw); + if (brw_vs_state_dirty(brw)) { + + brw_vs_populate_key(brw, &vs_key); + + if (!brw_search_cache(&brw->cache, BRW_CACHE_VS_PROG, + &vs_key, sizeof(vs_key), + &brw->vs.base.prog_offset, &brw->vs.prog_data)) { + bool success = brw_codegen_vs_prog(brw, current[MESA_SHADER_VERTEX], + vp, &vs_key); + (void) success; + assert(success); + } + brw->vs.base.prog_data = &brw->vs.prog_data->base.base; + + if (memcmp(&brw->vs.prog_data->base.vue_map, &brw->vue_map_geom_out, + sizeof(brw->vue_map_geom_out)) != 0) { + brw->vue_map_vs = brw->vs.prog_data->base.vue_map; + brw->ctx.NewDriverState |= BRW_NEW_VUE_MAP_VS; + if (brw->gen < 6) { + /* No geometry shader support, so the VS VUE map is the VUE map + * for the output of the "geometry" portion of the pipeline. + */ + brw->vue_map_geom_out = brw->vue_map_vs; + brw->ctx.NewDriverState |= BRW_NEW_VUE_MAP_GEOM_OUT; + } + } + } + + if (brw->gen < 6) { + + UPLOAD_FF_GS_PROG: + + if (brw_ff_gs_state_dirty(brw)) { + + /* Populate the key: + */ + brw_ff_gs_populate_key(brw, &ff_gs_key); + + if (brw->ff_gs.prog_active != ff_gs_key.need_gs_prog) { + brw->ctx.NewDriverState |= BRW_NEW_FF_GS_PROG_DATA; + brw->ff_gs.prog_active = ff_gs_key.need_gs_prog; + } + + if (brw->ff_gs.prog_active) { + if (!brw_search_cache(&brw->cache, BRW_CACHE_FF_GS_PROG, + &ff_gs_key, sizeof(ff_gs_key), + &brw->ff_gs.prog_offset, &brw->ff_gs.prog_data)) { + brw_codegen_ff_gs_prog(brw, &ff_gs_key); + } + } + } + } else { + + if (brw_gs_state_dirty(brw)) { + + if (gp == NULL) { + /* No geometry shader. Vertex data just passes straight through. */ + if (brw->ctx.NewDriverState & BRW_NEW_VUE_MAP_VS) { + brw->vue_map_geom_out = brw->vue_map_vs; + brw->ctx.NewDriverState |= BRW_NEW_VUE_MAP_GEOM_OUT; + } + + if (brw->gen == 6 && + (brw->ctx.NewDriverState & BRW_NEW_TRANSFORM_FEEDBACK)) { + goto UPLOAD_FF_GS_PROG; + } + + /* Other state atoms had better not try to access prog_data, + * since there's no GS program. + */ + brw->gs.prog_data = NULL; + brw->gs.base.prog_data = NULL; + } else { + + brw_gs_populate_key(brw, &gs_key); + + if (!brw_search_cache(&brw->cache, BRW_CACHE_GS_PROG, + &gs_key, sizeof(gs_key), + &stage_state->prog_offset, &brw->gs.prog_data)) { + bool success = brw_codegen_gs_prog(brw, current[MESA_SHADER_GEOMETRY], + gp, &gs_key); + assert(success); + (void)success; + } + brw->gs.base.prog_data = &brw->gs.prog_data->base.base; + + if (memcmp(&brw->gs.prog_data->base.vue_map, &brw->vue_map_geom_out, + sizeof(brw->vue_map_geom_out)) != 0) { + brw->vue_map_geom_out = brw->gs.prog_data->base.vue_map; + brw->ctx.NewDriverState |= BRW_NEW_VUE_MAP_GEOM_OUT; + } + } + } + } + + if (brw_wm_state_dirty(brw)) { + + brw_wm_populate_key(brw, &wm_key); + + if (!brw_search_cache(&brw->cache, BRW_CACHE_FS_PROG, + &wm_key, sizeof(wm_key), + &brw->wm.base.prog_offset, &brw->wm.prog_data)) { + bool success = brw_codegen_wm_prog(brw, current_fp, fp, &wm_key); + (void) success; + assert(success); + } + brw->wm.base.prog_data = &brw->wm.prog_data->base; + } - 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_vs.c b/src/mesa/drivers/dri/i965/brw_vs.c index d03567e..548bccc 100644 --- a/src/mesa/drivers/dri/i965/brw_vs.c +++ b/src/mesa/drivers/dri/i965/brw_vs.c @@ -403,7 +403,7 @@ brw_setup_vue_key_clip_info(struct brw_context *brw, } } -static bool +bool brw_vs_state_dirty(struct brw_context *brw) { return brw_state_dirty(brw, @@ -417,7 +417,7 @@ brw_vs_state_dirty(struct brw_context *brw) BRW_NEW_VS_ATTRIB_WORKAROUNDS); } -static void +void brw_vs_populate_key(struct brw_context *brw, struct brw_vs_prog_key *key) { @@ -466,45 +466,6 @@ brw_vs_populate_key(struct brw_context *brw, sizeof(brw->vb.attrib_wa_flags)); } -void -brw_upload_vs_prog(struct brw_context *brw) -{ - struct gl_context *ctx = &brw->ctx; - struct gl_shader_program **current = ctx->_Shader->CurrentProgram; - struct brw_vs_prog_key key; - /* BRW_NEW_VERTEX_PROGRAM */ - struct brw_vertex_program *vp = - (struct brw_vertex_program *)brw->vertex_program; - - if (!brw_vs_state_dirty(brw)) - return; - - brw_vs_populate_key(brw, &key); - - if (!brw_search_cache(&brw->cache, BRW_CACHE_VS_PROG, - &key, sizeof(key), - &brw->vs.base.prog_offset, &brw->vs.prog_data)) { - bool success = brw_codegen_vs_prog(brw, current[MESA_SHADER_VERTEX], - vp, &key); - (void) success; - assert(success); - } - brw->vs.base.prog_data = &brw->vs.prog_data->base.base; - - if (memcmp(&brw->vs.prog_data->base.vue_map, &brw->vue_map_geom_out, - sizeof(brw->vue_map_geom_out)) != 0) { - brw->vue_map_vs = brw->vs.prog_data->base.vue_map; - brw->ctx.NewDriverState |= BRW_NEW_VUE_MAP_VS; - if (brw->gen < 6) { - /* No geometry shader support, so the VS VUE map is the VUE map for - * the output of the "geometry" portion of the pipeline. - */ - brw->vue_map_geom_out = brw->vue_map_vs; - brw->ctx.NewDriverState |= BRW_NEW_VUE_MAP_GEOM_OUT; - } - } -} - bool brw_vs_precompile(struct gl_context *ctx, struct gl_shader_program *shader_prog, diff --git a/src/mesa/drivers/dri/i965/brw_vs.h b/src/mesa/drivers/dri/i965/brw_vs.h index 6157ae6..c12c774 100644 --- a/src/mesa/drivers/dri/i965/brw_vs.h +++ b/src/mesa/drivers/dri/i965/brw_vs.h @@ -72,8 +72,12 @@ void brw_vs_debug_recompile(struct brw_context *brw, const struct brw_vs_prog_key *key); bool brw_vs_prog_data_compare(const void *a, const void *b); +bool +brw_vs_state_dirty(struct brw_context *brw); + void -brw_upload_vs_prog(struct brw_context *brw); +brw_vs_populate_key(struct brw_context *brw, + struct brw_vs_prog_key *key); bool brw_codegen_vs_prog(struct brw_context *brw, diff --git a/src/mesa/drivers/dri/i965/brw_wm.c b/src/mesa/drivers/dri/i965/brw_wm.c index 45a03bb..882206c 100644 --- a/src/mesa/drivers/dri/i965/brw_wm.c +++ b/src/mesa/drivers/dri/i965/brw_wm.c @@ -430,7 +430,7 @@ brw_populate_sampler_prog_key_data(struct gl_context *ctx, } } -static bool +bool brw_wm_state_dirty (struct brw_context *brw) { return brw_state_dirty(brw, @@ -451,8 +451,9 @@ brw_wm_state_dirty (struct brw_context *brw) BRW_NEW_VUE_MAP_GEOM_OUT); } -static void brw_wm_populate_key( struct brw_context *brw, - struct brw_wm_prog_key *key ) +void +brw_wm_populate_key(struct brw_context *brw, + struct brw_wm_prog_key *key ) { struct gl_context *ctx = &brw->ctx; /* BRW_NEW_FRAGMENT_PROGRAM */ @@ -611,27 +612,3 @@ static void brw_wm_populate_key( struct brw_context *brw, /* The unique fragment program ID */ key->program_string_id = fp->id; } - -void -brw_upload_wm_prog(struct brw_context *brw) -{ - struct gl_context *ctx = &brw->ctx; - struct gl_shader_program *current = ctx->_Shader->_CurrentFragmentProgram; - struct brw_wm_prog_key key; - struct brw_fragment_program *fp = (struct brw_fragment_program *) - brw->fragment_program; - - if (!brw_wm_state_dirty(brw)) - return; - - brw_wm_populate_key(brw, &key); - - if (!brw_search_cache(&brw->cache, BRW_CACHE_FS_PROG, - &key, sizeof(key), - &brw->wm.base.prog_offset, &brw->wm.prog_data)) { - bool success = brw_codegen_wm_prog(brw, current, fp, &key); - (void) success; - assert(success); - } - brw->wm.base.prog_data = &brw->wm.prog_data->base; -} diff --git a/src/mesa/drivers/dri/i965/brw_wm.h b/src/mesa/drivers/dri/i965/brw_wm.h index 0a8a97b..22af0af 100644 --- a/src/mesa/drivers/dri/i965/brw_wm.h +++ b/src/mesa/drivers/dri/i965/brw_wm.h @@ -87,8 +87,12 @@ void brw_wm_debug_recompile(struct brw_context *brw, const struct brw_wm_prog_key *key); bool brw_wm_prog_data_compare(const void *a, const void *b); +bool +brw_wm_state_dirty (struct brw_context *brw); + void -brw_upload_wm_prog(struct brw_context *brw); +brw_wm_populate_key(struct brw_context *brw, + struct brw_wm_prog_key *key); #ifdef __cplusplus } // extern "C" -- 2.1.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev