From: Kenneth Graunke Date: Tue, 22 Aug 2017 22:12:55 +0000 (-0700) Subject: i965: Fix state flagging of Gen6 SOL programs. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=e5654fc4506ce9789577204e9b1629071855d811;p=mesa.git i965: Fix state flagging of Gen6 SOL programs. It doesn't seem like the old code could possibly work. 1. brw_gs_state_dirty made us bail unless one of these flags were set: _NEW_TEXTURE, BRW_NEW_GEOMETRY_PROGRAM, BRW_NEW_TRANSFORM_FEEDBACK 2. If there was no geometry program, we called brw_upload_ff_gs_prog()3 3. That checked brw_ff_gs_state_dirty and bailed unless these were set: _NEW_LIGHT, BRW_NEW_PRIMITIVE, BRW_NEW_TRANSFORM_FEEDBACK, BRW_NEW_VS_PROG_DATA. 4. brw_ff_gs_prog_key pv_first and attr fields were set based on data depending on _NEW_LIGHT and BRW_NEW_VS_PROG_DATA. This means that if we needed a FF GS program, and changed the VS outputs or provoking vertex mode, we'd fail to notice that we needed to emit a new program. Reviewed-by: Jordan Justen --- diff --git a/src/mesa/drivers/dri/i965/brw_gs.c b/src/mesa/drivers/dri/i965/brw_gs.c index a0afe67a9aa..5a170de8459 100644 --- a/src/mesa/drivers/dri/i965/brw_gs.c +++ b/src/mesa/drivers/dri/i965/brw_gs.c @@ -207,22 +207,6 @@ brw_upload_gs_prog(struct brw_context *brw) if (!brw_gs_state_dirty(brw)) return; - if (gp == NULL) { - /* No geometry shader. Vertex data just passes straight through. */ - if (devinfo->gen == 6 && - (brw->ctx.NewDriverState & BRW_NEW_TRANSFORM_FEEDBACK)) { - 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.base.prog_data = NULL; - - return; - } - brw_gs_populate_key(brw, &key); if (!brw_search_cache(&brw->cache, BRW_CACHE_GS_PROG, diff --git a/src/mesa/drivers/dri/i965/brw_state_upload.c b/src/mesa/drivers/dri/i965/brw_state_upload.c index c69d707c09f..7b31aad170a 100644 --- a/src/mesa/drivers/dri/i965/brw_state_upload.c +++ b/src/mesa/drivers/dri/i965/brw_state_upload.c @@ -400,10 +400,13 @@ brw_upload_programs(struct brw_context *brw, brw_upload_vs_prog(brw); brw_upload_tess_programs(brw); - if (devinfo->gen < 6) - brw_upload_ff_gs_prog(brw); - else + if (brw->geometry_program) { brw_upload_gs_prog(brw); + } else { + brw->gs.base.prog_data = NULL; + if (devinfo->gen < 7) + brw_upload_ff_gs_prog(brw); + } /* Update the VUE map for data exiting the GS stage of the pipeline. * This comes from the last enabled shader stage.