Files
test2/source/blender/blenlib/intern/compute_context.cc
Jacques Lucke c819d9fdc9 Fix #120579: incorrect compute context hashes
The problem was that `XXH3_128bits` was called on `len` bytes
and not `HashSizeInBytes + len` as before 51f8bf53b2.
This lead to more compute context duplicates that one would expect.

I changed the code a little bit to make this mistake less likely in case
the hash function is ever changed to something else.
2024-04-14 13:20:32 +02:00

57 lines
1.6 KiB
C++

/* SPDX-FileCopyrightText: 2023 Blender Authors
*
* SPDX-License-Identifier: GPL-2.0-or-later */
#include "BLI_compute_context.hh"
#include <sstream>
#include <xxhash.h>
namespace blender {
void ComputeContextHash::mix_in(const void *data, int64_t len)
{
const int64_t hash_size = sizeof(ComputeContextHash);
const int64_t buffer_len = hash_size + len;
DynamicStackBuffer<> buffer_owner(buffer_len, 8);
char *buffer = static_cast<char *>(buffer_owner.buffer());
memcpy(buffer, this, hash_size);
memcpy(buffer + hash_size, data, len);
const XXH128_hash_t hash = XXH3_128bits(buffer, buffer_len);
memcpy(this, &hash, sizeof(hash));
static_assert(sizeof(ComputeContextHash) == sizeof(hash));
}
std::ostream &operator<<(std::ostream &stream, const ComputeContextHash &hash)
{
std::stringstream ss;
ss << "0x" << std::hex << hash.v1 << hash.v2;
stream << ss.str();
return stream;
}
void ComputeContext::print_stack(std::ostream &stream, StringRef name) const
{
Stack<const ComputeContext *> stack;
for (const ComputeContext *current = this; current; current = current->parent_) {
stack.push(current);
}
stream << "Context Stack: " << name << "\n";
while (!stack.is_empty()) {
const ComputeContext *current = stack.pop();
stream << "-> ";
current->print_current_in_line(stream);
const ComputeContextHash &current_hash = current->hash_;
stream << " \t(hash: " << current_hash << ")\n";
}
}
std::ostream &operator<<(std::ostream &stream, const ComputeContext &compute_context)
{
compute_context.print_stack(stream, "");
return stream;
}
} // namespace blender