radv/bvh: Replace is_final_tree with bvh_offset

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20818>
This commit is contained in:
Konstantin Seurer 2023-01-19 21:39:59 +01:00 committed by Marge Bot
parent 688f598237
commit 4e87a01b93
4 changed files with 15 additions and 15 deletions

View file

@ -109,13 +109,13 @@ struct radv_ir_node {
float cost; float cost;
}; };
#define FINAL_TREE_PRESENT 0 #define RADV_UNKNOWN_BVH_OFFSET 0xFFFFFFFF
#define FINAL_TREE_NOT_PRESENT 1 #define RADV_NULL_BVH_OFFSET 0xFFFFFFFE
#define FINAL_TREE_UNKNOWN 2
struct radv_ir_box_node { struct radv_ir_box_node {
radv_ir_node base; radv_ir_node base;
uint32_t children[2]; uint32_t children[2];
uint32_t in_final_tree; uint32_t bvh_offset;
}; };
struct radv_ir_aabb_node { struct radv_ir_aabb_node {

View file

@ -161,12 +161,12 @@ main()
uint32_t node_id = pack_node_id(dst_node_offset, radv_bvh_node_box32); uint32_t node_id = pack_node_id(dst_node_offset, radv_bvh_node_box32);
for (;;) { for (;;) {
/* Make changes to the current node's in_final_tree value visible. */ /* Make changes to the current node's BVH offset value visible. */
memoryBarrier(gl_ScopeDevice, gl_StorageSemanticsBuffer, memoryBarrier(gl_ScopeDevice, gl_StorageSemanticsBuffer,
gl_SemanticsAcquireRelease | gl_SemanticsMakeAvailable | gl_SemanticsMakeVisible); gl_SemanticsAcquireRelease | gl_SemanticsMakeAvailable | gl_SemanticsMakeVisible);
uint32_t in_final_tree = node_id == RADV_BVH_ROOT_NODE ? FINAL_TREE_PRESENT : DEREF(src_node).in_final_tree; uint32_t bvh_offset = node_id == RADV_BVH_ROOT_NODE ? id_to_offset(RADV_BVH_ROOT_NODE) : DEREF(src_node).bvh_offset;
if (in_final_tree == FINAL_TREE_UNKNOWN) if (bvh_offset == RADV_UNKNOWN_BVH_OFFSET)
continue; continue;
uint32_t found_child_count = 0; uint32_t found_child_count = 0;
@ -221,8 +221,8 @@ main()
children[collapsed_child_index] = children[found_child_count]; children[collapsed_child_index] = children[found_child_count];
} }
if (in_final_tree == FINAL_TREE_PRESENT) if (bvh_offset != RADV_NULL_BVH_OFFSET)
DEREF(child_node).in_final_tree = FINAL_TREE_NOT_PRESENT; DEREF(child_node).bvh_offset = RADV_NULL_BVH_OFFSET;
} else } else
break; break;
} }
@ -237,9 +237,9 @@ main()
uint32_t child_index = offset_in_internal_nodes / SIZEOF(radv_ir_box_node); uint32_t child_index = offset_in_internal_nodes / SIZEOF(radv_ir_box_node);
dst_offset = dst_internal_offset + child_index * SIZEOF(radv_bvh_box32_node); dst_offset = dst_internal_offset + child_index * SIZEOF(radv_bvh_box32_node);
if (in_final_tree == FINAL_TREE_PRESENT) { if (bvh_offset != RADV_NULL_BVH_OFFSET) {
REF(radv_ir_box_node) child_node = REF(radv_ir_box_node)OFFSET(args.intermediate_bvh, offset); REF(radv_ir_box_node) child_node = REF(radv_ir_box_node)OFFSET(args.intermediate_bvh, offset);
DEREF(child_node).in_final_tree = FINAL_TREE_PRESENT; DEREF(child_node).bvh_offset = dst_offset;
} }
} else { } else {
uint32_t child_index = offset / intermediate_leaf_node_size; uint32_t child_index = offset / intermediate_leaf_node_size;
@ -255,7 +255,7 @@ main()
uint32_t child_id = pack_node_id(dst_offset, ir_type_to_bvh_type(type)); uint32_t child_id = pack_node_id(dst_offset, ir_type_to_bvh_type(type));
children[i] = child_id; children[i] = child_id;
if (in_final_tree == FINAL_TREE_PRESENT) if (bvh_offset != RADV_NULL_BVH_OFFSET)
set_parent(child_id, node_id); set_parent(child_id, node_id);
} }
@ -266,7 +266,7 @@ main()
} }
} }
/* Make changes to the children's in_final_tree value available to the other invocations. */ /* Make changes to the children's BVH offset value available to the other invocations. */
memoryBarrier(gl_ScopeDevice, gl_StorageSemanticsBuffer, memoryBarrier(gl_ScopeDevice, gl_StorageSemanticsBuffer,
gl_SemanticsAcquireRelease | gl_SemanticsMakeAvailable | gl_SemanticsMakeVisible); gl_SemanticsAcquireRelease | gl_SemanticsMakeAvailable | gl_SemanticsMakeVisible);

View file

@ -117,7 +117,7 @@ main(void)
radv_ir_box_node node_value; radv_ir_box_node node_value;
node_value.base.aabb = bounds; node_value.base.aabb = bounds;
node_value.in_final_tree = FINAL_TREE_UNKNOWN; node_value.bvh_offset = RADV_UNKNOWN_BVH_OFFSET;
node_value.children = children; node_value.children = children;
DEREF(node) = node_value; DEREF(node) = node_value;

View file

@ -137,7 +137,7 @@ push_node(uint32_t children[2])
#if EXTENDED_SAH #if EXTENDED_SAH
DEREF(dst_node).base.cost = cost * 0.5 + BVH_LEVEL_COST; DEREF(dst_node).base.cost = cost * 0.5 + BVH_LEVEL_COST;
#endif #endif
DEREF(dst_node).in_final_tree = FINAL_TREE_UNKNOWN; DEREF(dst_node).bvh_offset = RADV_UNKNOWN_BVH_OFFSET;
return dst_id; return dst_id;
} }