Module: Mesa Branch: main Commit: 1ead8f73752729550e1bf3446c27363a2e556f5e URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=1ead8f73752729550e1bf3446c27363a2e556f5e
Author: Mike Blumenkrantz <[email protected]> Date: Fri Mar 24 16:41:47 2023 -0400 zink: add another vstate draw template for popcnt presence matching radeonsi Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22116> --- src/gallium/drivers/zink/zink_draw.cpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/gallium/drivers/zink/zink_draw.cpp b/src/gallium/drivers/zink/zink_draw.cpp index 36ec9a45b95..9a97bc497b7 100644 --- a/src/gallium/drivers/zink/zink_draw.cpp +++ b/src/gallium/drivers/zink/zink_draw.cpp @@ -13,6 +13,7 @@ #include "tgsi/tgsi_from_mesa.h" #include "util/hash_table.h" +#include "util/u_cpu_detect.h" #include "util/u_debug.h" #include "util/u_helpers.h" #include "util/u_inlines.h" @@ -949,7 +950,7 @@ zink_draw_vbo(struct pipe_context *pctx, zink_draw<HAS_MULTIDRAW, DYNAMIC_STATE, BATCH_CHANGED, false>(pctx, info, drawid_offset, indirect, draws, num_draws, NULL, 0); } -template <zink_multidraw HAS_MULTIDRAW, zink_dynamic_state DYNAMIC_STATE, bool BATCH_CHANGED> +template <zink_multidraw HAS_MULTIDRAW, zink_dynamic_state DYNAMIC_STATE, bool HAS_POPCNT, bool BATCH_CHANGED> static void zink_draw_vertex_state(struct pipe_context *pctx, struct pipe_vertex_state *vstate, @@ -1068,15 +1069,16 @@ zink_launch_grid(struct pipe_context *pctx, const struct pipe_grid_info *info) template <zink_multidraw HAS_MULTIDRAW, zink_dynamic_state DYNAMIC_STATE, bool BATCH_CHANGED> static void -init_batch_changed_functions(struct zink_context *ctx, pipe_draw_vbo_func draw_vbo_array[2][6][2], pipe_draw_vertex_state_func draw_state_array[2][6][2]) +init_batch_changed_functions(struct zink_context *ctx, pipe_draw_vbo_func draw_vbo_array[2][6][2], pipe_draw_vertex_state_func draw_state_array[2][6][2][2]) { draw_vbo_array[HAS_MULTIDRAW][DYNAMIC_STATE][BATCH_CHANGED] = zink_draw_vbo<HAS_MULTIDRAW, DYNAMIC_STATE, BATCH_CHANGED>; - draw_state_array[HAS_MULTIDRAW][DYNAMIC_STATE][BATCH_CHANGED] = zink_draw_vertex_state<HAS_MULTIDRAW, DYNAMIC_STATE, BATCH_CHANGED>; + draw_state_array[HAS_MULTIDRAW][DYNAMIC_STATE][0][BATCH_CHANGED] = zink_draw_vertex_state<HAS_MULTIDRAW, DYNAMIC_STATE, false, BATCH_CHANGED>; + draw_state_array[HAS_MULTIDRAW][DYNAMIC_STATE][1][BATCH_CHANGED] = zink_draw_vertex_state<HAS_MULTIDRAW, DYNAMIC_STATE, true, BATCH_CHANGED>; } template <zink_multidraw HAS_MULTIDRAW, zink_dynamic_state DYNAMIC_STATE> static void -init_dynamic_state_functions(struct zink_context *ctx, pipe_draw_vbo_func draw_vbo_array[2][6][2], pipe_draw_vertex_state_func draw_state_array[2][6][2]) +init_dynamic_state_functions(struct zink_context *ctx, pipe_draw_vbo_func draw_vbo_array[2][6][2], pipe_draw_vertex_state_func draw_state_array[2][6][2][2]) { init_batch_changed_functions<HAS_MULTIDRAW, DYNAMIC_STATE, false>(ctx, draw_vbo_array, draw_state_array); init_batch_changed_functions<HAS_MULTIDRAW, DYNAMIC_STATE, true>(ctx, draw_vbo_array, draw_state_array); @@ -1084,7 +1086,7 @@ init_dynamic_state_functions(struct zink_context *ctx, pipe_draw_vbo_func draw_v template <zink_multidraw HAS_MULTIDRAW> static void -init_multidraw_functions(struct zink_context *ctx, pipe_draw_vbo_func draw_vbo_array[2][6][2], pipe_draw_vertex_state_func draw_state_array[2][6][2]) +init_multidraw_functions(struct zink_context *ctx, pipe_draw_vbo_func draw_vbo_array[2][6][2], pipe_draw_vertex_state_func draw_state_array[2][6][2][2]) { init_dynamic_state_functions<HAS_MULTIDRAW, ZINK_NO_DYNAMIC_STATE>(ctx, draw_vbo_array, draw_state_array); init_dynamic_state_functions<HAS_MULTIDRAW, ZINK_DYNAMIC_STATE>(ctx, draw_vbo_array, draw_state_array); @@ -1095,7 +1097,7 @@ init_multidraw_functions(struct zink_context *ctx, pipe_draw_vbo_func draw_vbo_a } static void -init_all_draw_functions(struct zink_context *ctx, pipe_draw_vbo_func draw_vbo_array[2][6][2], pipe_draw_vertex_state_func draw_state_array[2][6][2]) +init_all_draw_functions(struct zink_context *ctx, pipe_draw_vbo_func draw_vbo_array[2][6][2], pipe_draw_vertex_state_func draw_state_array[2][6][2][2]) { init_multidraw_functions<ZINK_NO_MULTIDRAW>(ctx, draw_vbo_array, draw_state_array); init_multidraw_functions<ZINK_MULTIDRAW>(ctx, draw_vbo_array, draw_state_array); @@ -1214,7 +1216,7 @@ zink_init_draw_functions(struct zink_context *ctx, struct zink_screen *screen) pipe_draw_vbo_func draw_vbo_array[2][6] //multidraw, zink_dynamic_state [2]; //batch changed pipe_draw_vertex_state_func draw_state_array[2][6] //multidraw, zink_dynamic_state - [2]; //batch changed + [2][2]; //has_popcnt, batch changed zink_dynamic_state dynamic; if (screen->info.have_EXT_extended_dynamic_state) { if (screen->info.have_EXT_extended_dynamic_state2) { @@ -1240,7 +1242,7 @@ zink_init_draw_functions(struct zink_context *ctx, struct zink_screen *screen) [dynamic], sizeof(ctx->draw_vbo)); memcpy(ctx->draw_state, &draw_state_array[screen->info.have_EXT_multi_draw] - [dynamic], + [dynamic][util_get_cpu_caps()->has_popcnt], sizeof(ctx->draw_state)); /* Bind a fake draw_vbo, so that draw_vbo isn't NULL, which would skip
