blob: ba206ae46bfa5b5e00a5ecd4bc89c385b7a93095 [file] [log] [blame]
/*
* Copyright © 2025 Valve Corporation
*
* SPDX-License-Identifier: MIT
*/
/* Helpers for encoding BVH nodes on different HW generations. */
#ifndef RADV_BVH_INVOCATION_CLUSTER_H
#define RADV_BVH_INVOCATION_CLUSTER_H
struct radv_invocation_cluster {
uint32_t invocation_index;
uint32_t cluster_index;
uint32_t cluster_size;
};
/* cluster_size has to be a power of two and <32. */
void
radv_invocation_cluster_init(out radv_invocation_cluster cluster, uint32_t cluster_size)
{
cluster.invocation_index = gl_SubgroupInvocationID & (cluster_size - 1);
cluster.cluster_index = gl_SubgroupInvocationID / cluster_size;
cluster.cluster_size = cluster_size;
}
#define radv_read_invocation(cluster, index, value) \
subgroupShuffle(value, (gl_SubgroupInvocationID & (~(cluster.cluster_size - 1))) + index)
uint32_t
radv_ballot(radv_invocation_cluster cluster, bool value)
{
uvec4 ballot = subgroupBallot(value);
uint64_t ballot64 = uint64_t(ballot.x) | (uint64_t(ballot.y) << 32ul);
uint32_t cluster_shift = gl_SubgroupInvocationID & (~(cluster.cluster_size - 1));
return uint32_t((ballot64 >> cluster_shift) & ((1u << cluster.cluster_size) - 1));
}
#endif