summaryrefslogtreecommitdiffstats
path: root/src/mesa
diff options
context:
space:
mode:
authorKenneth Graunke <[email protected]>2017-08-22 15:12:55 -0700
committerKenneth Graunke <[email protected]>2017-09-02 12:56:18 -0700
commite5654fc4506ce9789577204e9b1629071855d811 (patch)
tree8eb765f5f21f98b7f5f3b62a34b7424ca447a1c6 /src/mesa
parent4ddbc0a07155335293f0d48823e1faae8665c799 (diff)
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 <[email protected]>
Diffstat (limited to 'src/mesa')
-rw-r--r--src/mesa/drivers/dri/i965/brw_gs.c16
-rw-r--r--src/mesa/drivers/dri/i965/brw_state_upload.c9
2 files changed, 6 insertions, 19 deletions
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.