Module: Mesa
Branch: main
Commit: 9bbf5505f06e4b4b178e7dd47c2e173f0415d695
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=9bbf5505f06e4b4b178e7dd47c2e173f0415d695

Author: Giancarlo Devich <[email protected]>
Date:   Tue Mar 14 11:50:03 2023 -0700

d3d12: Use short circuit in shader key compare; update key hash

Move common key compare to the final step; change to short circuit from
memcmp.

Update key hash to treat varying pointers as uint64.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21909>

---

 src/gallium/drivers/d3d12/d3d12_compiler.cpp | 34 ++++++++++++++++------------
 src/gallium/drivers/d3d12/d3d12_compiler.h   | 15 ++++++++----
 2 files changed, 29 insertions(+), 20 deletions(-)

diff --git a/src/gallium/drivers/d3d12/d3d12_compiler.cpp 
b/src/gallium/drivers/d3d12/d3d12_compiler.cpp
index 7f3eaf2fa15..f6bcd0c68d0 100644
--- a/src/gallium/drivers/d3d12/d3d12_compiler.cpp
+++ b/src/gallium/drivers/d3d12/d3d12_compiler.cpp
@@ -833,11 +833,6 @@ d3d12_compare_shader_keys(struct d3d12_selection_context* 
sel_ctx, const d3d12_s
       unreachable("invalid stage");
    }
    
-   if (memcmp(&expect->required_varying_inputs,
-              &have->required_varying_inputs,
-              offsetof(d3d12_shader_key, vs) - offsetof(d3d12_shader_key, 
required_varying_inputs)) != 0)
-      return false;
-   
    if (expect->n_texture_states != have->n_texture_states)
       return false;
 
@@ -860,8 +855,16 @@ d3d12_compare_shader_keys(struct d3d12_selection_context* 
sel_ctx, const d3d12_s
    if (memcmp(expect->image_format_conversion, have->image_format_conversion,
       expect->n_images * sizeof(struct d3d12_image_format_conversion_info)))
       return false;
-
-   return true;
+   
+   return
+      expect->required_varying_inputs == have->required_varying_inputs &&
+      expect->required_varying_outputs == have->required_varying_outputs &&
+      expect->next_varying_inputs == have->next_varying_inputs &&
+      expect->prev_varying_outputs == have->prev_varying_outputs &&
+      expect->common_all == have->common_all &&
+      expect->tex_saturate_s == have->tex_saturate_s &&
+      expect->tex_saturate_r == have->tex_saturate_r &&
+      expect->tex_saturate_t == have->tex_saturate_t;
 }
 
 static uint32_t
@@ -870,10 +873,11 @@ d3d12_shader_key_hash(const d3d12_shader_key *key)
    uint32_t hash;
 
    hash = (uint32_t)key->stage;
-   if (key->required_varying_inputs != nullptr)
-      hash += key->required_varying_inputs->mask + 
key->required_varying_inputs->max;
-   if (key->required_varying_outputs != nullptr)
-      hash += key->required_varying_outputs->mask + 
key->required_varying_outputs->max;
+   hash += ((uint64_t)key->required_varying_inputs) +
+            (((uint64_t)key->required_varying_inputs) >> 32);
+   hash += ((uint64_t)key->required_varying_outputs) +
+            (((uint64_t)key->required_varying_outputs) >> 32);
+
    hash += key->next_varying_inputs;
    hash += key->prev_varying_outputs;
    switch (key->stage) {
@@ -893,14 +897,14 @@ d3d12_shader_key_hash(const d3d12_shader_key *key)
       break;
    case PIPE_SHADER_TESS_CTRL:
       hash += key->hs.all;
-      if (key->hs.required_patch_outputs)
-         hash += key->hs.required_patch_outputs->mask + 
key->hs.required_patch_outputs->max;
+      hash += ((uint64_t)key->hs.required_patch_outputs) +
+               (((uint64_t)key->hs.required_patch_outputs) >> 32);
       break;
    case PIPE_SHADER_TESS_EVAL:
       hash += key->ds.tcs_vertices_out;
       hash += key->ds.prev_patch_outputs;
-      if (key->ds.required_patch_inputs)
-         hash += key->ds.required_patch_inputs->mask + 
key->ds.required_patch_inputs->max;
+      hash += ((uint64_t)key->ds.required_patch_inputs) +
+               (((uint64_t)key->ds.required_patch_inputs) >> 32);
       break;
    default:
       /* No type specific information to hash for other stages. */
diff --git a/src/gallium/drivers/d3d12/d3d12_compiler.h 
b/src/gallium/drivers/d3d12/d3d12_compiler.h
index 6cf4c97bd81..aebe7a9e6b0 100644
--- a/src/gallium/drivers/d3d12/d3d12_compiler.h
+++ b/src/gallium/drivers/d3d12/d3d12_compiler.h
@@ -106,11 +106,16 @@ struct d3d12_shader_key {
    struct d3d12_varying_info *required_varying_outputs;
    uint64_t next_varying_inputs;
    uint64_t prev_varying_outputs;
-   unsigned last_vertex_processing_stage : 1;
-   unsigned invert_depth : 16;
-   unsigned halfz : 1;
-   unsigned samples_int_textures : 1;
-   unsigned input_clip_size : 4;
+   union {
+      struct {
+         unsigned last_vertex_processing_stage : 1;
+         unsigned invert_depth : 16;
+         unsigned halfz : 1;
+         unsigned samples_int_textures : 1;
+         unsigned input_clip_size : 4;
+      };
+      uint32_t common_all;
+   };
    unsigned tex_saturate_s : PIPE_MAX_SAMPLERS;
    unsigned tex_saturate_r : PIPE_MAX_SAMPLERS;
    unsigned tex_saturate_t : PIPE_MAX_SAMPLERS;

Reply via email to