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;
