Mesa (master): freedreno/ir3: Add HS/DS/GS to shader key and cache

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Sep 25 21:58:36 UTC 2019


Module: Mesa
Branch: master
Commit: 87d234d9680685a7fff5b4a79d53180468fb2ba6
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=87d234d9680685a7fff5b4a79d53180468fb2ba6

Author: Kristian H. Kristensen <hoegsberg at google.com>
Date:   Thu Sep 19 13:59:36 2019 -0700

freedreno/ir3: Add HS/DS/GS to shader key and cache

Signed-off-by: Kristian H. Kristensen <hoegsberg at google.com>

---

 src/gallium/drivers/freedreno/ir3/ir3_cache.c | 33 +++++++++++++++++++++++----
 src/gallium/drivers/freedreno/ir3/ir3_cache.h |  4 ++--
 2 files changed, 31 insertions(+), 6 deletions(-)

diff --git a/src/gallium/drivers/freedreno/ir3/ir3_cache.c b/src/gallium/drivers/freedreno/ir3/ir3_cache.c
index e387291a92a..ba96628bd4a 100644
--- a/src/gallium/drivers/freedreno/ir3/ir3_cache.c
+++ b/src/gallium/drivers/freedreno/ir3/ir3_cache.c
@@ -93,16 +93,41 @@ ir3_cache_lookup(struct ir3_cache *cache, const struct ir3_cache_key *key,
 		return entry->data;
 	}
 
-	struct ir3_shader_variant *bs = ir3_shader_variant(key->vs, key->key, true, debug);
 	struct ir3_shader_variant *vs = ir3_shader_variant(key->vs, key->key, false, debug);
-	struct ir3_shader_variant *fs = ir3_shader_variant(key->fs, key->key, false, debug);
+	if (!vs)
+		return NULL;
+
+	struct ir3_shader_variant *hs = NULL, *ds = NULL;
+	if (key->hs) {
+		debug_assert(key->ds);
+		hs = ir3_shader_variant(key->hs, key->key, false, debug);
+		ds = ir3_shader_variant(key->ds, key->key, false, debug);
+		if (!hs || ! ds)
+			return NULL;
+	}
 
-	if (!bs || !vs || !fs) {
+	/* For tessellation, the binning shader is derived from the DS. */
+	struct ir3_shader_variant *bs;
+	if (key->ds)
+		bs = ir3_shader_variant(key->ds, key->key, true, debug);
+	else
+		bs = ir3_shader_variant(key->vs, key->key, true, debug);
+	if (!bs)
 		return NULL;
+
+	struct ir3_shader_variant *gs = NULL;
+	if (key->gs) {
+		gs = ir3_shader_variant(key->gs, key->key, false, debug);
+		if (!gs)
+			return NULL;
 	}
 
+	struct ir3_shader_variant *fs = ir3_shader_variant(key->fs, key->key, false, debug);
+	if (!fs)
+		return NULL;
+
 	struct ir3_program_state *state =
-		cache->funcs->create_state(cache->data, bs, vs, NULL, NULL, NULL, fs, &key->key);
+		cache->funcs->create_state(cache->data, bs, vs, hs, ds, gs, fs, &key->key);
 	state->key = *key;
 
 	/* NOTE: uses copy of key in state obj, because pointer passed by caller
diff --git a/src/gallium/drivers/freedreno/ir3/ir3_cache.h b/src/gallium/drivers/freedreno/ir3/ir3_cache.h
index 9343b535b57..d4332eeb38a 100644
--- a/src/gallium/drivers/freedreno/ir3/ir3_cache.h
+++ b/src/gallium/drivers/freedreno/ir3/ir3_cache.h
@@ -37,8 +37,8 @@
 
 /* key into program state cache */
 struct ir3_cache_key {
-	struct ir3_shader *vs, *fs;  // 4 dwords
-	struct ir3_shader_key key;   // 7 dwords
+	struct ir3_shader *vs, *hs, *ds, *gs, *fs;  // 5 pointers
+	struct ir3_shader_key key;             // 7 dwords
 };
 
 /* per-gen backend program state object should subclass this for it's




More information about the mesa-commit mailing list