i965: Fix state flagging of Gen6 SOL programs.
authorKenneth Graunke <kenneth@whitecape.org>
Tue, 22 Aug 2017 22:12:55 +0000 (15:12 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Sat, 2 Sep 2017 19:56:18 +0000 (12:56 -0700)
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 <jordan.l.justen@intel.com>
src/mesa/drivers/dri/i965/brw_gs.c
src/mesa/drivers/dri/i965/brw_state_upload.c

index a0afe67a9aa1988c3b0d16b6e1f01cf045e6f14b..5a170de845943ac0dadf888c7df79230616bf003 100644 (file)
@@ -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,
index c69d707c09f2e54c39995528113c03e8a1ef2c86..7b31aad170a55ce97ad22f23a39f6164589112d8 100644 (file)
@@ -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.