diff --git a/source/blender/draw/engines/workbench/workbench_mesh_passes.cc b/source/blender/draw/engines/workbench/workbench_mesh_passes.cc index add561a91f1..8404c6eb7e1 100644 --- a/source/blender/draw/engines/workbench/workbench_mesh_passes.cc +++ b/source/blender/draw/engines/workbench/workbench_mesh_passes.cc @@ -95,7 +95,7 @@ PassMain::Sub &MeshPass::get_subpass(eGeometryType geometry_type, }; return *texture_subpass_map_.lookup_or_add_cb( - TextureSubPassKey(*texture->gpu.texture, geometry_type), add_cb); + {*texture->gpu.texture, texture->sampler_state, geometry_type}, add_cb); } return get_subpass(geometry_type, eShaderType::MATERIAL); diff --git a/source/blender/draw/engines/workbench/workbench_private.hh b/source/blender/draw/engines/workbench/workbench_private.hh index 6a5e7c4920e..48c943f0dd9 100644 --- a/source/blender/draw/engines/workbench/workbench_private.hh +++ b/source/blender/draw/engines/workbench/workbench_private.hh @@ -278,7 +278,22 @@ struct SceneResources { class MeshPass : public PassMain { private: - using TextureSubPassKey = std::pair; + struct TextureSubPassKey { + GPUTexture *texture; + GPUSamplerState sampler_state; + eGeometryType geom_type; + + uint64_t hash() const + { + return get_default_hash(texture, sampler_state.as_uint(), geom_type); + } + + bool operator==(TextureSubPassKey const &rhs) const + { + return this->texture == rhs.texture && this->sampler_state == rhs.sampler_state && + this->geom_type == rhs.geom_type; + } + }; Map texture_subpass_map_; diff --git a/source/blender/gpu/GPU_texture.hh b/source/blender/gpu/GPU_texture.hh index 76d99183325..db4e4f478d4 100644 --- a/source/blender/gpu/GPU_texture.hh +++ b/source/blender/gpu/GPU_texture.hh @@ -623,6 +623,16 @@ struct GPUSamplerState { return serialized_parameters; } + uint32_t as_uint() const + { + uint32_t value = filtering; + value = (value << 4) | extend_x; + value = (value << 4) | extend_yz; + value = (value << 8) | custom_type; + value = (value << 8) | type; + return value; + } + bool operator==(GPUSamplerState const &rhs) const { return this->filtering == rhs.filtering && this->extend_x == rhs.extend_x &&