Skip to content

Commit b239af0

Browse files
Merge branch 'replacement-instance-fix-5' into 'main'
Prevent subPrim instances from being returned when searching for root instances. See merge request lightspeedrtx/dxvk-remix-nv!1677
2 parents 620c76a + 167ec6d commit b239af0

File tree

2 files changed

+13
-1
lines changed

2 files changed

+13
-1
lines changed

src/dxvk/rtx_render/rtx_instance_manager.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -800,7 +800,11 @@ namespace dxvk {
800800
// (need to check a 2x2x2 patch of cells to account for positions close to a border)
801801
result = const_cast<RtInstance*>(blas.getSpatialMap().getNearestData(worldPosition, uniqueObjectDistanceSqr, nearestDistSqr,
802802
[&] (const RtInstance* instance) {
803-
return instance->m_frameLastUpdated != currentFrameIdx && instance->m_materialHash == material.getHash();
803+
// Filter out instances by returning false if the instance:
804+
// - has already been updated this frame
805+
// - doesn't use the same material
806+
// - is a sub prim of a replacement instance
807+
return instance->m_frameLastUpdated != currentFrameIdx && instance->m_materialHash == material.getHash() && !instance->m_primInstanceOwner.isSubPrim();
804808
}
805809
));
806810
if (nearestDistSqr == 0.0f && result != nullptr) {

src/dxvk/rtx_render/rtx_types.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,14 @@ class PrimInstanceOwner {
155155
ReplacementInstance* getOrCreateReplacementInstance(void* owner, PrimInstance::Type type, size_t index, size_t numPrims);
156156
ReplacementInstance* getReplacementInstance() const { return m_replacementInstance; }
157157
size_t getReplacementIndex() const { return m_replacementIndex; }
158+
bool isSubPrim() const {
159+
if (m_replacementInstance == nullptr) {
160+
return false;
161+
} else {
162+
return m_replacementIndex != ReplacementInstance::kInvalidReplacementIndex &&
163+
m_replacementInstance->root.getUntyped() != m_replacementInstance->prims[m_replacementIndex].getUntyped();
164+
}
165+
}
158166
private:
159167
ReplacementInstance* m_replacementInstance = nullptr;
160168
size_t m_replacementIndex = ReplacementInstance::kInvalidReplacementIndex;

0 commit comments

Comments
 (0)