aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRob Clark <robdclark@chromium.org>2020-06-20 12:39:14 -0700
committerRob Clark <robdclark@chromium.org>2020-06-26 08:53:00 -0700
commit83b97bf161f50371a09fdc02b3ca045671469b09 (patch)
tree251bcf9e7ff0cfe84bd2f66852d69669e0220f22
parentfdbe1ffaf74c4b1e913947cff5f3f40ab7b5feca (diff)
downloadexternal_mesa3d-83b97bf161f50371a09fdc02b3ca045671469b09.tar.gz
external_mesa3d-83b97bf161f50371a09fdc02b3ca045671469b09.tar.bz2
external_mesa3d-83b97bf161f50371a09fdc02b3ca045671469b09.zip
freedreno/a6xx+ir3: stop generating pointless binning shaders
Currently we always do sysmem if there is tess. And for GS, the binning pass VS ends up identical to the draw pass VS, so no point in compiling it twice. (For GS what we should do someday is generate a binning pass GS, and possibly if we can do cross-stage linking opts, an optimized binning pass VS, but the required outputs would somehow have to end up in the shader variant key.) Signed-off-by: Rob Clark <robdclark@chromium.org> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5372>
-rw-r--r--src/freedreno/ir3/ir3_shader.h11
-rw-r--r--src/freedreno/vulkan/tu_pipeline.c3
-rw-r--r--src/gallium/drivers/freedreno/a6xx/fd6_program.c5
-rw-r--r--src/gallium/drivers/freedreno/ir3/ir3_cache.c15
4 files changed, 21 insertions, 13 deletions
diff --git a/src/freedreno/ir3/ir3_shader.h b/src/freedreno/ir3/ir3_shader.h
index cbbdce767ee..2ccc9a86cd3 100644
--- a/src/freedreno/ir3/ir3_shader.h
+++ b/src/freedreno/ir3/ir3_shader.h
@@ -643,6 +643,17 @@ ir3_shader_stage(struct ir3_shader_variant *v)
}
}
+/* Currently we do not do binning for tess. And for GS there is no
+ * cross-stage VS+GS optimization, so the full VS+GS is used in
+ * the binning pass.
+ */
+static inline bool
+ir3_has_binning_vs(const struct ir3_shader_key *key)
+{
+ if (key->tessellation || key->has_gs)
+ return false;
+ return true;
+}
/**
* Represents a shader at the API level, before state-specific variants are
diff --git a/src/freedreno/vulkan/tu_pipeline.c b/src/freedreno/vulkan/tu_pipeline.c
index 54d011b002a..64a92008af2 100644
--- a/src/freedreno/vulkan/tu_pipeline.c
+++ b/src/freedreno/vulkan/tu_pipeline.c
@@ -2001,7 +2001,8 @@ tu_pipeline_builder_compile_shaders(struct tu_pipeline_builder *builder,
const struct tu_shader *vs = builder->shaders[MESA_SHADER_VERTEX];
struct ir3_shader_variant *variant;
- if (vs->ir3_shader->stream_output.num_outputs) {
+ if (vs->ir3_shader->stream_output.num_outputs ||
+ !ir3_has_binning_vs(&key)) {
variant = builder->variants[MESA_SHADER_VERTEX];
} else {
bool created;
diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_program.c b/src/gallium/drivers/freedreno/a6xx/fd6_program.c
index dbf145359df..5b5d9b56420 100644
--- a/src/gallium/drivers/freedreno/a6xx/fd6_program.c
+++ b/src/gallium/drivers/freedreno/a6xx/fd6_program.c
@@ -228,10 +228,7 @@ setup_config_stateobj(struct fd_ringbuffer *ring, struct fd6_program_state *stat
OUT_PKT4(ring, REG_A6XX_HLSQ_UPDATE_CNTL, 1);
OUT_RING(ring, 0xff); /* XXX */
- if (state->ds)
- debug_assert(state->ds->constlen >= state->bs->constlen);
- else
- debug_assert(state->vs->constlen >= state->bs->constlen);
+ debug_assert(state->vs->constlen >= state->bs->constlen);
OUT_PKT4(ring, REG_A6XX_HLSQ_VS_CNTL, 4);
OUT_RING(ring, A6XX_HLSQ_VS_CNTL_CONSTLEN(state->vs->constlen) |
diff --git a/src/gallium/drivers/freedreno/ir3/ir3_cache.c b/src/gallium/drivers/freedreno/ir3/ir3_cache.c
index 5f6bb20fe8b..606e610be79 100644
--- a/src/gallium/drivers/freedreno/ir3/ir3_cache.c
+++ b/src/gallium/drivers/freedreno/ir3/ir3_cache.c
@@ -132,17 +132,16 @@ ir3_cache_lookup(struct ir3_cache *cache, const struct ir3_cache_key *key,
}
}
- /* For tessellation, the binning shader is derived from the DS. */
struct ir3_shader_variant *bs;
- if (key->ds) {
- shader_key.safe_constlen = !!(safe_constlens & (1 << MESA_SHADER_TESS_EVAL));
- bs = ir3_shader_variant(key->ds, shader_key, true, debug);
- } else {
+
+ if (ir3_has_binning_vs(&key->key)) {
shader_key.safe_constlen = !!(safe_constlens & (1 << MESA_SHADER_VERTEX));
- bs = ir3_shader_variant(key->vs, shader_key, true, debug);
+ bs = ir3_shader_variant(key->vs, key->key, true, debug);
+ if (!bs)
+ return NULL;
+ } else {
+ bs = variants[MESA_SHADER_VERTEX];
}
- if (!bs)
- return NULL;
struct ir3_program_state *state =
cache->funcs->create_state(cache->data, bs,