public static RootSignature FromString(CommonContext context, string s) { RootSignature rootSignature; if (context.rootSignatures.TryGetValue(s, out rootSignature)) { return(rootSignature); } rootSignature = new RootSignature(); context.rootSignatures[s] = rootSignature; RootSignatureParamP[] desc = new RootSignatureParamP[s.Length]; for (int i = 0; i < s.Length; i++) { char c = s[i]; switch (c) { case 'C': desc[i] = RootSignatureParamP.CBV; break; case 'c': desc[i] = RootSignatureParamP.CBVTable; break; case 'S': desc[i] = RootSignatureParamP.SRV; break; case 's': desc[i] = RootSignatureParamP.SRVTable; break; case 'U': desc[i] = RootSignatureParamP.UAV; break; case 'u': desc[i] = RootSignatureParamP.UAVTable; break; default: throw new NotImplementedException("error root signature desc."); break; } } context.device.CreateRootSignature(rootSignature, desc); return(rootSignature); }
public void CreateRootSignature(RootSignature rootSignature, IList <RootSignatureParamP> types) { //static samplers StaticSamplerDescription[] samplerDescription = new StaticSamplerDescription[4]; samplerDescription[0] = new StaticSamplerDescription(ShaderVisibility.All, 0, 0) { AddressU = TextureAddressMode.Clamp, AddressV = TextureAddressMode.Clamp, AddressW = TextureAddressMode.Clamp, BorderColor = StaticBorderColor.OpaqueBlack, ComparisonFunction = ComparisonFunction.Never, Filter = Filter.MinMagMipLinear, MipLODBias = 0, MaxAnisotropy = 0, MinLOD = 0, MaxLOD = float.MaxValue, ShaderVisibility = ShaderVisibility.All, RegisterSpace = 0, ShaderRegister = 0, }; samplerDescription[1] = samplerDescription[0]; samplerDescription[2] = samplerDescription[0]; samplerDescription[3] = samplerDescription[0]; samplerDescription[1].ShaderRegister = 1; samplerDescription[2].ShaderRegister = 2; samplerDescription[3].ShaderRegister = 3; samplerDescription[1].MaxAnisotropy = 16; samplerDescription[1].Filter = Filter.Anisotropic; samplerDescription[2].ComparisonFunction = ComparisonFunction.Less; samplerDescription[2].Filter = Filter.ComparisonMinMagMipLinear; samplerDescription[3].Filter = Filter.MinMagMipPoint; RootParameter1[] rootParameters = new RootParameter1[types.Count]; int cbvCount = 0; int srvCount = 0; int uavCount = 0; rootSignature.cbv.Clear(); rootSignature.srv.Clear(); rootSignature.uav.Clear(); for (int i = 0; i < types.Count; i++) { RootSignatureParamP t = types[i]; switch (t) { case RootSignatureParamP.CBV: rootParameters[i] = new RootParameter1(RootParameterType.ConstantBufferView, new RootDescriptor1(cbvCount, 0), ShaderVisibility.All); rootSignature.cbv[cbvCount] = i; cbvCount++; break; case RootSignatureParamP.SRV: rootParameters[i] = new RootParameter1(RootParameterType.ShaderResourceView, new RootDescriptor1(srvCount, 0), ShaderVisibility.All); rootSignature.srv[srvCount] = i; srvCount++; break; case RootSignatureParamP.UAV: rootParameters[i] = new RootParameter1(RootParameterType.UnorderedAccessView, new RootDescriptor1(uavCount, 0), ShaderVisibility.All); rootSignature.uav[uavCount] = i; uavCount++; break; case RootSignatureParamP.CBVTable: rootParameters[i] = new RootParameter1(new RootDescriptorTable1(new DescriptorRange1(DescriptorRangeType.ConstantBufferView, 1, cbvCount)), ShaderVisibility.All); rootSignature.cbv[cbvCount] = i; cbvCount++; break; case RootSignatureParamP.SRVTable: rootParameters[i] = new RootParameter1(new RootDescriptorTable1(new DescriptorRange1(DescriptorRangeType.ShaderResourceView, 1, srvCount)), ShaderVisibility.All); rootSignature.srv[srvCount] = i; srvCount++; break; case RootSignatureParamP.UAVTable: rootParameters[i] = new RootParameter1(new RootDescriptorTable1(new DescriptorRange1(DescriptorRangeType.UnorderedAccessView, 1, uavCount)), ShaderVisibility.All); rootSignature.uav[uavCount] = i; uavCount++; break; } } RootSignatureDescription1 rootSignatureDescription = new RootSignatureDescription1(); rootSignatureDescription.StaticSamplers = samplerDescription; rootSignatureDescription.Flags = RootSignatureFlags.AllowInputAssemblerInputLayout; rootSignatureDescription.Parameters = rootParameters; rootSignature.rootSignature = device.CreateRootSignature <ID3D12RootSignature>(0, rootSignatureDescription); }