getDescriptorFromExplicitHeapIndex
Description
Convert an explicit descriptor-heap index (from ResourceDescriptorHeap[i] / SamplerDescriptorHeap[j], packed as handle.x) into a descriptor T. Shared by every untyped-handle429496726642949671744294967186resource constructor.
When the handle would use the native SPIR-V representation 429496726642949671684294967188 usesNativeSpirvDescriptorHandle<T>(), i.e. spvBindlessTextureNV enabled and T an encodable texture/sampler 429496726642949671684294967188 routing the index through the (type, capability)-keyed getDescriptorFromHandle would let the NV dispatch in defaultGetDescriptorFromHandle reinterpret it as a native uint64 handle (issue #13070). In that case, load directly from the EXT heap when one also exists (spvBindlessTextureNV+spvDescriptorHeapEXT); when it does not (plain spvBindlessTextureNV), there is no heap to load from and the index conversion is unsupported 429496726642949671684294967188 fall through to getDescriptorFromHandle (whose .Handle counterpart is diagnosed in the constructors above). In every other case defer to getDescriptorFromHandle, which is correct for the index and preserves a user override 429496726642949671684294967188 this includes spvDescriptorHeapEXT alone (usesNativeSpirvDescriptorHandle is false without NV, so the override is honored) and non-native types on any target. The EXT-direct load is deliberately nested inside the usesNativeSpirvDescriptorHandle guard rather than keyed on spvDescriptorHeapEXT alone: gating it behind NV is what lets spvDescriptorHeapEXT-only compiles keep honoring a user getDescriptorFromHandle override, since only the NV+EXT combination must bypass it to avoid the uint64 reinterpretation.
Signature
T getDescriptorFromExplicitHeapIndex<T>(vector<uint, 2> handle) where T : IOpaqueDescriptor;