summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKenneth Graunke <[email protected]>2015-12-15 03:04:50 -0800
committerKenneth Graunke <[email protected]>2015-12-22 17:21:59 -0800
commit8498cb4a45e8ed53a2ee2b35d3c2cbb9963e1756 (patch)
treebfbac178730c3fa332f288ce708df1f1e972bf1c
parent2bcf98940703bee4485e323f4a9e28e2c6fe41fd (diff)
i965: Only call brw_upload_tcs/tes_prog when using tessellation.
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 <[email protected]> Reviewed-by: Jordan Justen <[email protected]>
-rw-r--r--src/mesa/drivers/dri/i965/brw_state_upload.c11
-rw-r--r--src/mesa/drivers/dri/i965/brw_tcs.c17
-rw-r--r--src/mesa/drivers/dri/i965/brw_tes.c9
3 files changed, 13 insertions, 24 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_state_upload.c b/src/mesa/drivers/dri/i965/brw_state_upload.c
index 56962d59c49..af9fb5b8a63 100644
--- a/src/mesa/drivers/dri/i965/brw_state_upload.c
+++ b/src/mesa/drivers/dri/i965/brw_state_upload.c
@@ -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);
diff --git a/src/mesa/drivers/dri/i965/brw_tcs.c b/src/mesa/drivers/dri/i965/brw_tcs.c
index b5eb4cdde5e..037a2da7681 100644
--- a/src/mesa/drivers/dri/i965/brw_tcs.c
+++ b/src/mesa/drivers/dri/i965/brw_tcs.c
@@ -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,
diff --git a/src/mesa/drivers/dri/i965/brw_tes.c b/src/mesa/drivers/dri/i965/brw_tes.c
index 3c1270679f9..4b2bf8cdcdd 100644
--- a/src/mesa/drivers/dri/i965/brw_tes.c
+++ b/src/mesa/drivers/dri/i965/brw_tes.c
@@ -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));