i965: Only call brw_upload_tcs/tes_prog when using tessellation.
authorKenneth Graunke <kenneth@whitecape.org>
Tue, 15 Dec 2015 11:04:50 +0000 (03:04 -0800)
committerKenneth Graunke <kenneth@whitecape.org>
Wed, 23 Dec 2015 01:21:59 +0000 (17:21 -0800)
If there's no evaluation shader, tessellation is disabled.  The upload
functions would just bail.  Instead, don't bother calling them.

This will simplify the optional-TCS case a bit, as brw_upload_tcs can
assume that we're doing tessellation.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
src/mesa/drivers/dri/i965/brw_state_upload.c
src/mesa/drivers/dri/i965/brw_tcs.c
src/mesa/drivers/dri/i965/brw_tes.c

index 56962d59c499dad1dadd59cde7bac7d77661f4be..af9fb5b8a63c0db66108cf8a02f984ff106c9443 100644 (file)
@@ -678,8 +678,15 @@ brw_upload_programs(struct brw_context *brw,
 {
    if (pipeline == BRW_RENDER_PIPELINE) {
       brw_upload_vs_prog(brw);
-      brw_upload_tcs_prog(brw);
-      brw_upload_tes_prog(brw);
+      if (brw->tess_eval_program) {
+         brw_upload_tcs_prog(brw);
+         brw_upload_tes_prog(brw);
+      } else {
+         brw->tcs.prog_data = NULL;
+         brw->tcs.base.prog_data = NULL;
+         brw->tes.prog_data = NULL;
+         brw->tes.base.prog_data = NULL;
+      }
 
       if (brw->gen < 6)
          brw_upload_ff_gs_prog(brw);
index b5eb4cdde5ec3d767f9a4ac1f54ea30fed4ca7d7..037a2da76818ebf7ce4545d616be8a813d9fe33f 100644 (file)
@@ -187,6 +187,10 @@ brw_upload_tcs_prog(struct brw_context *brw)
    /* BRW_NEW_TESS_CTRL_PROGRAM */
    struct brw_tess_ctrl_program *tcp =
       (struct brw_tess_ctrl_program *) brw->tess_ctrl_program;
+   /* BRW_NEW_TESS_EVAL_PROGRAM */
+   struct brw_tess_eval_program *tep =
+      (struct brw_tess_eval_program *) brw->tess_eval_program;
+   assert(tcp && tep);
 
    if (!brw_state_dirty(brw,
                         _NEW_TEXTURE,
@@ -195,15 +199,6 @@ brw_upload_tcs_prog(struct brw_context *brw)
                         BRW_NEW_TESS_EVAL_PROGRAM))
       return;
 
-   if (tcp == NULL) {
-      /* Other state atoms had better not try to access prog_data, since
-       * there's no HS program.
-       */
-      brw->tcs.prog_data = NULL;
-      brw->tcs.base.prog_data = NULL;
-      return;
-   }
-
    struct gl_program *prog = &tcp->program.Base;
 
    memset(&key, 0, sizeof(key));
@@ -216,13 +211,9 @@ brw_upload_tcs_prog(struct brw_context *brw)
    brw_populate_sampler_prog_key_data(ctx, prog, stage_state->sampler_count,
                                       &key.tex);
 
-   /* BRW_NEW_TESS_EVAL_PROGRAM */
    /* We need to specialize our code generation for tessellation levels
     * based on the domain the DS is expecting to tessellate.
     */
-   struct brw_tess_eval_program *tep =
-      (struct brw_tess_eval_program *) brw->tess_eval_program;
-   assert(tep);
    key.tes_primitive_mode = tep->program.PrimitiveMode;
 
    if (!brw_search_cache(&brw->cache, BRW_CACHE_TCS_PROG,
index 3c1270679f9aaa3918c7aa903f538ab818a8f5e0..4b2bf8cdcdd6b419268bbe67f80406de65221f10 100644 (file)
@@ -241,15 +241,6 @@ brw_upload_tes_prog(struct brw_context *brw)
                         BRW_NEW_TESS_EVAL_PROGRAM))
       return;
 
-   if (tep == NULL) {
-      /* Other state atoms had better not try to access prog_data, since
-       * there's no TES program.
-       */
-      brw->tes.prog_data = NULL;
-      brw->tes.base.prog_data = NULL;
-      return;
-   }
-
    struct gl_program *prog = &tep->program.Base;
 
    memset(&key, 0, sizeof(key));