public void BindResources(CommandList commandList, DescriptorSet[] descriptorSets) { for (int setIndex = 0; setIndex < descriptorSetBindings.Length; setIndex++) { var bindingOperations = descriptorSetBindings[setIndex]; if (bindingOperations == null) { continue; } var descriptorSet = descriptorSets[setIndex]; var bindingOperation = Interop.Pin(ref bindingOperations[0]); for (int index = 0; index < bindingOperations.Length; index++, bindingOperation = Interop.IncrementPinned(bindingOperation)) { var value = descriptorSet.HeapObjects[descriptorSet.DescriptorStartOffset + bindingOperation.EntryIndex]; switch (bindingOperation.Class) { case EffectParameterClass.ConstantBuffer: { commandList.SetConstantBuffer(bindingOperation.Stage, bindingOperation.SlotStart, (Buffer)value.Value); break; } case EffectParameterClass.Sampler: { commandList.SetSamplerState(bindingOperation.Stage, bindingOperation.SlotStart, bindingOperation.ImmutableSampler ?? (SamplerState)value.Value); break; } case EffectParameterClass.ShaderResourceView: { commandList.UnsetUnorderedAccessView(value.Value as GraphicsResource); commandList.SetShaderResourceView(bindingOperation.Stage, bindingOperation.SlotStart, (GraphicsResource)value.Value); break; } case EffectParameterClass.UnorderedAccessView: { commandList.SetUnorderedAccessView(bindingOperation.Stage, bindingOperation.SlotStart, (GraphicsResource)value.Value); break; } default: throw new ArgumentOutOfRangeException(); } } } }