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

Reply via email to