Esempio n. 1
0
        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()));
            }
        }
Esempio n. 2
0
        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()));
                }
            }
        }
Esempio n. 3
0
 internal static InputElementDescription[] CreateLayoutFromType(int slot)
 {
     return(InputElementDescriptionFactory.Create(typeof(T), slot));
 }