Cycles: Add utility function to query graph node size in bytes

This commit is contained in:
Sergey Sharybin 2018-07-27 11:40:44 +02:00
parent 9a080d2ea6
commit 709b36e43b
2 changed files with 84 additions and 4 deletions

@ -425,20 +425,22 @@ bool Node::equals(const Node& other) const
/* Hash */ /* Hash */
namespace {
template<typename T> template<typename T>
static void value_hash(const Node *node, const SocketType& socket, MD5Hash& md5) void value_hash(const Node *node, const SocketType& socket, MD5Hash& md5)
{ {
md5.append(((uint8_t*)node) + socket.struct_offset, socket.size()); md5.append(((uint8_t*)node) + socket.struct_offset, socket.size());
} }
static void float3_hash(const Node *node, const SocketType& socket, MD5Hash& md5) void float3_hash(const Node *node, const SocketType& socket, MD5Hash& md5)
{ {
/* Don't compare 4th element used for padding. */ /* Don't compare 4th element used for padding. */
md5.append(((uint8_t*)node) + socket.struct_offset, sizeof(float) * 3); md5.append(((uint8_t*)node) + socket.struct_offset, sizeof(float) * 3);
} }
template<typename T> template<typename T>
static void array_hash(const Node *node, const SocketType& socket, MD5Hash& md5) void array_hash(const Node *node, const SocketType& socket, MD5Hash& md5)
{ {
const array<T>& a = *(const array<T>*)(((char*)node) + socket.struct_offset); const array<T>& a = *(const array<T>*)(((char*)node) + socket.struct_offset);
for (size_t i = 0; i < a.size(); i++) { for (size_t i = 0; i < a.size(); i++) {
@ -446,7 +448,7 @@ static void array_hash(const Node *node, const SocketType& socket, MD5Hash& md5)
} }
} }
static void float3_array_hash(const Node *node, const SocketType& socket, MD5Hash& md5) void float3_array_hash(const Node *node, const SocketType& socket, MD5Hash& md5)
{ {
/* Don't compare 4th element used for padding. */ /* Don't compare 4th element used for padding. */
const array<float3>& a = *(const array<float3>*)(((char*)node) + socket.struct_offset); const array<float3>& a = *(const array<float3>*)(((char*)node) + socket.struct_offset);
@ -455,6 +457,8 @@ static void float3_array_hash(const Node *node, const SocketType& socket, MD5Has
} }
} }
} // namespace
void Node::hash(MD5Hash& md5) void Node::hash(MD5Hash& md5)
{ {
md5.append(type->name.string()); md5.append(type->name.string());
@ -495,4 +499,77 @@ void Node::hash(MD5Hash& md5)
} }
} }
namespace {
template<typename T>
size_t array_size_in_bytes(const Node *node, const SocketType& socket)
{
const array<T>& a = *(const array<T>*)(((char*)node) + socket.struct_offset);
return a.size() * sizeof(T);
}
} // namespace
size_t Node::get_total_size_in_bytes() const
{
size_t total_size = 0;
foreach(const SocketType& socket, type->inputs) {
switch(socket.type) {
case SocketType::BOOLEAN:
case SocketType::FLOAT:
case SocketType::INT:
case SocketType::UINT:
case SocketType::COLOR:
case SocketType::VECTOR:
case SocketType::POINT:
case SocketType::NORMAL:
case SocketType::POINT2:
case SocketType::CLOSURE:
case SocketType::STRING:
case SocketType::ENUM:
case SocketType::TRANSFORM:
case SocketType::NODE:
total_size += socket.size();
break;
case SocketType::BOOLEAN_ARRAY:
total_size += array_size_in_bytes<bool>(this, socket);
break;
case SocketType::FLOAT_ARRAY:
total_size += array_size_in_bytes<float>(this, socket);
break;
case SocketType::INT_ARRAY:
total_size += array_size_in_bytes<int>(this, socket);
break;
case SocketType::COLOR_ARRAY:
total_size += array_size_in_bytes<float3>(this, socket);
break;
case SocketType::VECTOR_ARRAY:
total_size += array_size_in_bytes<float3>(this, socket);
break;
case SocketType::POINT_ARRAY:
total_size += array_size_in_bytes<float3>(this, socket);
break;
case SocketType::NORMAL_ARRAY:
total_size += array_size_in_bytes<float3>(this, socket);
break;
case SocketType::POINT2_ARRAY:
total_size += array_size_in_bytes<float2>(this, socket);
break;
case SocketType::STRING_ARRAY:
total_size += array_size_in_bytes<ustring>(this, socket);
break;
case SocketType::TRANSFORM_ARRAY:
total_size += array_size_in_bytes<Transform>(this, socket);
break;
case SocketType::NODE_ARRAY:
total_size += array_size_in_bytes<void*>(this, socket);
break;
case SocketType::UNDEFINED: break;
}
}
return total_size;
}
CCL_NAMESPACE_END CCL_NAMESPACE_END

@ -92,6 +92,9 @@ struct Node
/* compute hash of node and its socket values */ /* compute hash of node and its socket values */
void hash(MD5Hash& md5); void hash(MD5Hash& md5);
/* Get total size of this node. */
size_t get_total_size_in_bytes() const;
ustring name; ustring name;
const NodeType *type; const NodeType *type;
}; };