summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/freedreno/ir3/ir3_nir.c2
-rw-r--r--src/freedreno/ir3/ir3_shader.h33
-rw-r--r--src/gallium/drivers/freedreno/a6xx/fd6_draw.c17
3 files changed, 51 insertions, 1 deletions
diff --git a/src/freedreno/ir3/ir3_nir.c b/src/freedreno/ir3/ir3_nir.c
index 99659a7ddef..ab092ff1eda 100644
--- a/src/freedreno/ir3/ir3_nir.c
+++ b/src/freedreno/ir3/ir3_nir.c
@@ -104,7 +104,7 @@ ir3_key_lowers_nir(const struct ir3_shader_key *key)
key->vsaturate_s | key->vsaturate_t | key->vsaturate_r |
key->ucp_enables | key->color_two_side |
key->fclamp_color | key->vclamp_color |
- key->has_gs;
+ key->tessellation | key->has_gs;
}
#define OPT(nir, pass, ...) ({ \
diff --git a/src/freedreno/ir3/ir3_shader.h b/src/freedreno/ir3/ir3_shader.h
index 84a7807a0c8..c829422ca4d 100644
--- a/src/freedreno/ir3/ir3_shader.h
+++ b/src/freedreno/ir3/ir3_shader.h
@@ -249,6 +249,17 @@ struct ir3_shader_key {
unsigned rasterflat : 1;
unsigned fclamp_color : 1;
+ /* Indicates that this is a tessellation pipeline which requires a
+ * whole different kind of vertex shader. In case of
+ * tessellation, this field also tells us which kind of output
+ * topology the TES uses, which the TCS needs to know.
+ */
+#define IR3_TESS_NONE 0
+#define IR3_TESS_TRIANGLES 1
+#define IR3_TESS_QUADS 2
+#define IR3_TESS_ISOLINES 3
+ unsigned tessellation : 2;
+
unsigned has_gs : 1;
};
uint32_t global;
@@ -348,6 +359,7 @@ ir3_normalize_key(struct ir3_shader_key *key, gl_shader_stage type)
key->vastc_srgb = 0;
key->vsamples = 0;
key->has_gs = false; /* FS doesn't care */
+ key->tessellation = IR3_TESS_NONE;
}
break;
case MESA_SHADER_VERTEX:
@@ -362,6 +374,27 @@ ir3_normalize_key(struct ir3_shader_key *key, gl_shader_stage type)
key->fastc_srgb = 0;
key->fsamples = 0;
}
+
+ /* VS and GS only care about whether or not we're tessellating. */
+ key->tessellation = !!key->tessellation;
+ break;
+ case MESA_SHADER_TESS_CTRL:
+ case MESA_SHADER_TESS_EVAL:
+ key->color_two_side = false;
+ key->half_precision = false;
+ key->rasterflat = false;
+ if (key->has_per_samp) {
+ key->fsaturate_s = 0;
+ key->fsaturate_t = 0;
+ key->fsaturate_r = 0;
+ key->fastc_srgb = 0;
+ key->fsamples = 0;
+ key->vsaturate_s = 0;
+ key->vsaturate_t = 0;
+ key->vsaturate_r = 0;
+ key->vastc_srgb = 0;
+ key->vsamples = 0;
+ }
break;
default:
/* TODO */
diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_draw.c b/src/gallium/drivers/freedreno/a6xx/fd6_draw.c
index fcf0dc19233..a635e66d932 100644
--- a/src/gallium/drivers/freedreno/a6xx/fd6_draw.c
+++ b/src/gallium/drivers/freedreno/a6xx/fd6_draw.c
@@ -157,6 +157,23 @@ fd6_draw_vbo(struct fd_context *ctx, const struct pipe_draw_info *info,
.sprite_coord_mode = ctx->rasterizer->sprite_coord_mode,
};
+ if (info->mode == PIPE_PRIM_PATCHES) {
+ shader_info *ds_info = &emit.key.ds->nir->info;
+ switch (ds_info->tess.primitive_mode) {
+ case GL_ISOLINES:
+ emit.key.key.tessellation = IR3_TESS_ISOLINES;
+ break;
+ case GL_TRIANGLES:
+ emit.key.key.tessellation = IR3_TESS_TRIANGLES;
+ break;
+ case GL_QUADS:
+ emit.key.key.tessellation = IR3_TESS_QUADS;
+ break;
+ default:
+ unreachable("bad tessmode");
+ }
+ }
+
if (emit.key.gs)
emit.key.key.has_gs = true;