public unsafe void SetMaterialConstantValue <TValue>(ConstantBufferBinding binding, TValue value) where TValue : struct { Assure.True(Shader.ContainsBinding(binding), "Binding is not attributed to the FragmentShader set for this material."); Assure.True( binding.GetBoundResource() is ConstantBuffer <TValue>, "Expected a resource of type 'ConstantBuffer<" + typeof(TValue).Name + ">' set at " + binding + ", but instead found " + binding.GetBoundResource().ToStringNullSafe("no binding") + "." ); Assure.True( binding.GetBoundResource().CanDiscardWrite, "Given shader resource (" + binding.GetBoundResource() + ") must have discard-write capability." ); if (cbufferValuePtrs.ContainsKey(binding)) { Marshal.FreeHGlobal(cbufferValuePtrs[binding]); } IntPtr valuePtr = Marshal.AllocHGlobal(new IntPtr(binding.BufferSizeBytes)); UnsafeUtils.WriteGenericToPtr(valuePtr, value, binding.BufferSizeBytes); using (RenderingModule.RenderStateBarrier.AcquirePermit(withLock: instanceMutationLock)) { cbufferValuePtrs[binding] = valuePtr; fragmentShaderResources.SetValue(binding, valuePtr); } }
public void TestBindingMethods() { ConstantBuffer <Matrix> testBuffer = BufferFactory.NewConstantBuffer <Matrix>().WithUsage(ResourceUsage.DiscardWrite); IShaderResourceBinding[] bindingArr = { new TextureSamplerBinding(0U, "TS0"), new TextureSamplerBinding(1U, "TS1"), new TextureSamplerBinding(5U, "TS5"), new ResourceViewBinding(0U, "RV0"), new ResourceViewBinding(2U, "RV2"), new ConstantBufferBinding(3U, "CB3", testBuffer) }; Shader shader = new FragmentShader(@"Tests\SimpleFS.cso", bindingArr); Assert.AreEqual(bindingArr[0], shader.GetBindingByIdentifier("TS0")); Assert.AreEqual(bindingArr[1], shader.GetBindingByIdentifier("TS1")); Assert.AreEqual(bindingArr[2], shader.GetBindingByIdentifier("TS5")); Assert.AreEqual(bindingArr[3], shader.GetBindingByIdentifier("RV0")); Assert.AreEqual(bindingArr[4], shader.GetBindingByIdentifier("RV2")); Assert.AreEqual(bindingArr[5], shader.GetBindingByIdentifier("CB3")); Assert.IsTrue(shader.ContainsBinding("TS0")); Assert.IsTrue(shader.ContainsBinding("TS1")); Assert.IsFalse(shader.ContainsBinding("TS2")); Assert.IsTrue(shader.ContainsBinding(bindingArr[0])); Assert.IsTrue(shader.ContainsBinding(bindingArr[1])); Assert.IsFalse(shader.ContainsBinding(new TextureSamplerBinding(0U, "TS0"))); shader.Dispose(); testBuffer.Dispose(); }