freedreno/a6xx: Avoid zero-init fd6_emit

A pretty significant amount of time spent in fd6_draw_vbo is calling
memset to zero init the on-stack struct.  And a big part of the size
of the struct is fd6_state, of which we only need to initialize
num_groups to zero.  This is worth a 15% improvement in drawoverhead
test 0 ("no state change").

Signed-off-by: Rob Clark <robdclark@chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20572>
This commit is contained in:
Rob Clark
2023-01-02 12:38:19 -08:00
committed by Marge Bot
parent dfd16c489a
commit 7b734cc668
+18 -15
View File
@@ -140,29 +140,32 @@ fd6_draw_vbo(struct fd_context *ctx, const struct pipe_draw_info *info,
{
struct fd6_context *fd6_ctx = fd6_context(ctx);
struct shader_info *gs_info = ir3_get_shader_info(ctx->prog.gs);
struct fd6_emit emit = {
.ctx = ctx,
.info = info,
.indirect = indirect,
.draw = draw,
.key = {
struct fd6_emit emit;
emit.ctx = ctx;
emit.info = info;
emit.indirect = indirect;
emit.draw = draw;
emit.key = (struct ir3_cache_key){
.vs = ctx->prog.vs,
.gs = ctx->prog.gs,
.fs = ctx->prog.fs,
.key = {
.rasterflat = ctx->rasterizer->flatshade,
.ucp_enables = ctx->rasterizer->clip_plane_enable,
.sample_shading = (ctx->min_samples > 1),
.msaa = (ctx->framebuffer.samples > 1),
.rasterflat = ctx->rasterizer->flatshade,
.ucp_enables = ctx->rasterizer->clip_plane_enable,
.sample_shading = (ctx->min_samples > 1),
.msaa = (ctx->framebuffer.samples > 1),
},
.clip_plane_enable = ctx->rasterizer->clip_plane_enable,
.patch_vertices = ctx->patch_vertices,
},
.rasterflat = ctx->rasterizer->flatshade,
.sprite_coord_enable = ctx->rasterizer->sprite_coord_enable,
.sprite_coord_mode = ctx->rasterizer->sprite_coord_mode,
.primitive_restart = info->primitive_restart && info->index_size,
};
emit.rasterflat = ctx->rasterizer->flatshade;
emit.sprite_coord_enable = ctx->rasterizer->sprite_coord_enable;
emit.sprite_coord_mode = ctx->rasterizer->sprite_coord_mode;
emit.primitive_restart = info->primitive_restart && info->index_size;
emit.state.num_groups = 0;
emit.streamout_mask = 0;
emit.prog = NULL;
if (!(ctx->prog.vs && ctx->prog.fs))
return false;