diff --git a/src/freedreno/ir3/ir3_shader.h b/src/freedreno/ir3/ir3_shader.h index 3073dfd07eb..fa6d5b7d387 100644 --- a/src/freedreno/ir3/ir3_shader.h +++ b/src/freedreno/ir3/ir3_shader.h @@ -213,6 +213,8 @@ struct ir3_shader_key { */ unsigned rasterflat : 1; unsigned fclamp_color : 1; + + unsigned has_gs : 1; }; uint32_t global; }; @@ -310,9 +312,11 @@ ir3_normalize_key(struct ir3_shader_key *key, gl_shader_stage type) key->vsaturate_r = 0; key->vastc_srgb = 0; key->vsamples = 0; + key->has_gs = false; /* FS doesn't care */ } break; case MESA_SHADER_VERTEX: + case MESA_SHADER_GEOMETRY: key->color_two_side = false; key->half_precision = false; key->rasterflat = false; diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_draw.c b/src/gallium/drivers/freedreno/a6xx/fd6_draw.c index 1d5df60c533..a0df3dbc1ea 100644 --- a/src/gallium/drivers/freedreno/a6xx/fd6_draw.c +++ b/src/gallium/drivers/freedreno/a6xx/fd6_draw.c @@ -157,6 +157,9 @@ fd6_draw_vbo(struct fd_context *ctx, const struct pipe_draw_info *info, .sprite_coord_mode = ctx->rasterizer->sprite_coord_mode, }; + if (emit.key.gs) + emit.key.key.has_gs = true; + fixup_shader_state(ctx, &emit.key.key); if (!(ctx->dirty & FD_DIRTY_PROG)) { @@ -209,13 +212,12 @@ fd6_draw_vbo(struct fd_context *ctx, const struct pipe_draw_info *info, */ emit_marker6(ring, 7); - /* leave vis mode blank for now, it will be patched up when - * we know if we are binning or not - */ uint32_t draw0 = CP_DRAW_INDX_OFFSET_0_PRIM_TYPE(primtype) | - CP_DRAW_INDX_OFFSET_0_VIS_CULL(USE_VISIBILITY) | - 0x2000; + CP_DRAW_INDX_OFFSET_0_VIS_CULL(USE_VISIBILITY); + + if (emit.key.gs) + draw0 |= CP_DRAW_INDX_OFFSET_0_GS_ENABLE; if (info->index_size) { draw0 |=