public unsafe VertexDataProcessorGroup CreateVertexDataProcessors(Type[] types) { if (_disposed) { throw new ObjectDisposedException("Pipeline"); } var desc = Enumerable.Empty <InputElementDescription>(); var processors = new object[types.Length]; var deviceTypeList = new[] { typeof(LightDevice) }; var deviceObject = new object[] { _device }; for (int i = 0; i < types.Length; ++i) { desc = desc.Concat(InputElementDescriptionFactory.Create(types[i], i)); var processorType = typeof(VertexDataProcessor <>).MakeGenericType(types[i]); var ctor = processorType.GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic, null, deviceTypeList, null); processors[i] = ctor.Invoke(deviceObject); } var list = desc.ToArray(); using (var layout = new ComScopeGuard()) { fixed(InputElementDescription *d = list) { Device.CreateInputLayout(_device.DevicePtr, d, (uint)list.Length, Blob.GetBufferPointer(_signatureBlob), Blob.GetBufferSize(_signatureBlob), out layout.Ptr).Check(); } return(new VertexDataProcessorGroup(_device, types, processors, layout.Move())); } }
public unsafe ShaderResourceBuffer <T> CreateShaderResourceBuffer <T>(T[] data, bool isStructured) where T : unmanaged { var elementSize = Marshal.SizeOf <T>(); BufferDescription bd = new BufferDescription() { ByteWidth = (uint)(elementSize * data.Length), Usage = 1, //immutable BindFlags = 8, //shader resource CPUAccessFlags = 0, //none MiscFlags = isStructured ? 64u : 0u, //D3D11_RESOURCE_MISC_BUFFER_STRUCTURED StructureByteStride = (uint)elementSize, }; using (var buffer = new ComScopeGuard()) { fixed(T *pData = &data[0]) { DataBox box = new DataBox { DataPointer = pData, RowPitch = 0, SlicePitch = 0, }; Device.CreateBuffer(_device.DevicePtr, &bd, &box, out buffer.Ptr).Check(); } using (var view = new ComScopeGuard()) { int *viewDesc = stackalloc int[5] { isStructured ? 0 : InputElementDescriptionFactory.GetFormatFromType(typeof(T)), isStructured ? 11 : 1, //D3D_SRV_DIMENSION_BUFFEREX or D3D_SRV_DIMENSION_BUFFER 0, //FirstElement = 0 data.Length, //NumElements 0, //Not used }; Device.CreateShaderResourceView(_device.DevicePtr, buffer.Ptr, viewDesc, out view.Ptr).Check(); return(new ShaderResourceBuffer <T>(_device, buffer.Move(), view.Move())); } } }
internal static InputElementDescription[] CreateLayoutFromType(int slot) { return(InputElementDescriptionFactory.Create(typeof(T), slot)); }