internal virtual void RCQUpdateResources(RenderCommandQueue commandQueue, ShaderResourcePackage shaderResources) { for (int i = 0; i < ConstantBufferBindings.Length; i++) { commandQueue.QueueCommand(RenderCommand.DiscardWriteShaderConstantBuffer( ConstantBufferBindings[i], shaderResources.GetValue(ConstantBufferBindings[i]) )); } if (TextureSamplerBindings.Length > 0) { if (texSamplerValueDict == null) { texSamplerValueDict = new FastClearList <KVP <TextureSamplerBinding, TextureSampler> >(); } texSamplerValueDict.Clear(); for (int i = 0; i < TextureSamplerBindings.Length; ++i) { var tsb = TextureSamplerBindings[i]; texSamplerValueDict.Add(new KVP <TextureSamplerBinding, TextureSampler>(tsb, shaderResources.GetValue(tsb))); } commandQueue.QueueCommand(RenderCommand.SetShaderTextureSamplers(this, texSamplerValueDict)); } if (ResourceViewBindings.Length > 0) { if (resViewValueDict == null) { resViewValueDict = new FastClearList <KVP <ResourceViewBinding, IResourceView> >(); } resViewValueDict.Clear(); for (int i = 0; i < ResourceViewBindings.Length; ++i) { var rvb = ResourceViewBindings[i]; resViewValueDict.Add(new KVP <ResourceViewBinding, IResourceView>(rvb, shaderResources.GetValue(rvb))); Assure.False( ((BaseResourceView)shaderResources.GetValue(ResourceViewBindings[i])) != null && ((BaseResourceView)shaderResources.GetValue(ResourceViewBindings[i])).Resource.PermittedBindings == GPUBindings.None, "Underlying resource has no permitted GPU bindings." ); } commandQueue.QueueCommand(RenderCommand.SetShaderResourceViews(this, resViewValueDict)); } }
internal virtual void RCQUpdateResources(RenderCommandQueue commandQueue) { for (int i = 0; i < ConstantBufferBindings.Length; i++) { commandQueue.QueueCommand(RenderCommand.DiscardWriteShaderConstantBuffer( ConstantBufferBindings[i], ConstantBufferBindings[i].CurValuePtr )); } if (TextureSamplerBindings.Length > 0) { if (texSamplerValueDict == null) { texSamplerValueDict = new FastClearList <KVP <TextureSamplerBinding, TextureSampler> >(); } texSamplerValueDict.Clear(); for (int i = 0; i < TextureSamplerBindings.Length; ++i) { texSamplerValueDict.Add(new KVP <TextureSamplerBinding, TextureSampler>(TextureSamplerBindings[i], TextureSamplerBindings[i].GetBoundResource())); } commandQueue.QueueCommand(RenderCommand.SetShaderTextureSamplers(this, texSamplerValueDict)); } if (ResourceViewBindings.Length > 0) { if (resViewValueDict == null) { resViewValueDict = new FastClearList <KVP <ResourceViewBinding, IResourceView> >(); } resViewValueDict.Clear(); for (int i = 0; i < ResourceViewBindings.Length; ++i) { resViewValueDict.Add(new KVP <ResourceViewBinding, IResourceView>(ResourceViewBindings[i], ResourceViewBindings[i].GetBoundResourceAsBaseResourceView())); Assure.False(ResourceViewBindings[i].GetBoundResourceAsBaseResourceView().Resource.PermittedBindings == GPUBindings.None, "Underlying resource has no permitted GPU bindings."); } commandQueue.QueueCommand(RenderCommand.SetShaderResourceViews(this, resViewValueDict)); } }
public unsafe void TestSetShaderResourceViews() { Texture2DBuilder <TexelFormat.RGBA32UInt> texBuilder = TextureFactory.NewTexture2D <TexelFormat.RGBA32UInt>() .WithWidth(100U) .WithHeight(100U) .WithUsage(ResourceUsage.DiscardWrite); Texture2D <TexelFormat.RGBA32UInt> tex0 = texBuilder.Create(); Texture2D <TexelFormat.RGBA32UInt> tex2 = texBuilder.Create(); BaseResourceView rv0 = tex0.CreateView(); BaseResourceView rv2 = tex2.CreateView(); Shader shader = new FragmentShader( @"Tests\SimpleFS.cso", new ResourceViewBinding(0U, "RV0"), new ResourceViewBinding(1U, "RV1"), new ResourceViewBinding(2U, "RV2") ); Dictionary <ResourceViewBinding, BaseResourceView> rvDict = new Dictionary <ResourceViewBinding, BaseResourceView>(); rvDict[shader.ResourceViewBindings[0]] = rv0; rvDict[shader.ResourceViewBindings[2]] = rv2; RenderCommand testCommand = RenderCommand.SetShaderResourceViews(shader, rvDict); Assert.AreEqual(RenderCommandInstruction.FSSetResources, testCommand.Instruction); ResourceViewHandle *resHandleArray = (ResourceViewHandle *)new IntPtr(UnsafeUtils.Reinterpret <RenderCommandArgument, long>(testCommand.Arg1, sizeof(long))); Assert.AreEqual(rv0.ResourceViewHandle, resHandleArray[0]); Assert.AreEqual(ResourceViewHandle.NULL, resHandleArray[1]); Assert.AreEqual(rv2.ResourceViewHandle, resHandleArray[2]); Assert.AreEqual((RenderCommandArgument)3U, testCommand.Arg2); #if !DEVELOPMENT && !RELEASE try { RenderCommand.SetShaderResourceViews(null, rvDict); Assert.Fail(); } catch (AssuranceFailedException) { } try { RenderCommand.SetShaderResourceViews(shader, null); Assert.Fail(); } catch (AssuranceFailedException) { } #endif tex0.Dispose(); tex2.Dispose(); rv0.Dispose(); rv2.Dispose(); #if !DEVELOPMENT && !RELEASE try { RenderCommand.SetShaderResourceViews(shader, rvDict); Assert.Fail(); } catch (AssuranceFailedException) { } #endif shader.Dispose(); #if !DEVELOPMENT && !RELEASE try { RenderCommand.SetShaderResourceViews(shader, new Dictionary <ResourceViewBinding, BaseResourceView>()); Assert.Fail(); } catch (AssuranceFailedException) { } #endif }