예제 #1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="structureStride"></param>
        /// <param name="structureCount"></param>
        void Create(GraphicsDevice device, int structureStride, int structureCount, StructuredBufferFlags flags)
        {
            StructureCapacity = structureCount;
            StructureStride   = structureStride;

            Width  = structureCount;
            Height = 0;
            Depth  = 0;

            //	create staging buffer :
            var bufferDesc = new BufferDescription {
                BindFlags           = BindFlags.None,
                Usage               = ResourceUsage.Staging,
                CpuAccessFlags      = CpuAccessFlags.Write | CpuAccessFlags.Read,
                OptionFlags         = ResourceOptionFlags.BufferStructured,
                SizeInBytes         = structureCount * structureStride,
                StructureByteStride = structureStride
            };

            bufferStaging = new Buffer(device.Device, bufferDesc);



            //	create count buffer :
            bufferDesc = new BufferDescription {
                BindFlags      = BindFlags.None,
                Usage          = ResourceUsage.Staging,
                CpuAccessFlags = CpuAccessFlags.Write | CpuAccessFlags.Read,
                OptionFlags    = ResourceOptionFlags.None,
                SizeInBytes    = 4,
            };

            bufferCount = new Buffer(device.Device, bufferDesc);


            //	create GPU buffer :
            bufferDesc = new BufferDescription {
                BindFlags           = BindFlags.UnorderedAccess | BindFlags.ShaderResource,
                Usage               = ResourceUsage.Default,
                CpuAccessFlags      = CpuAccessFlags.None,
                OptionFlags         = ResourceOptionFlags.BufferStructured,
                SizeInBytes         = structureCount * structureStride,
                StructureByteStride = structureStride
            };

            bufferGpu = new Buffer(device.Device, bufferDesc);


            var uavFlag = UnorderedAccessViewBufferFlags.None;

            if (flags == StructuredBufferFlags.None)
            {
                uavFlag = UnorderedAccessViewBufferFlags.None;
            }
            if (flags == StructuredBufferFlags.Append)
            {
                uavFlag = UnorderedAccessViewBufferFlags.Append;
            }
            if (flags == StructuredBufferFlags.Counter)
            {
                uavFlag = UnorderedAccessViewBufferFlags.Counter;
            }

            //	create UAV :
            var uavDesc = new UnorderedAccessViewDescription {
                Format    = DXGI.Format.Unknown,
                Dimension = UnorderedAccessViewDimension.Buffer,
                Buffer    = new UnorderedAccessViewDescription.BufferResource {
                    ElementCount = structureCount,
                    FirstElement = 0,
                    Flags        = uavFlag
                }
            };

            uav = new UnorderedAccessView(device.Device, BufferGPU, uavDesc);


            //	create SRV :
            var srvDesc = new ShaderResourceViewDescription {
                Format    = DXGI.Format.Unknown,
                Buffer    = { ElementCount = structureCount, FirstElement = 0 },
                Dimension = ShaderResourceViewDimension.Buffer
            };

            SRV = new ShaderResourceView(device.Device, BufferGPU, srvDesc);
        }
예제 #2
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="rs"></param>
 /// <param name="elementCount"></param>
 /// <param name="elementType"></param>
 public StructuredBuffer(GraphicsDevice device, int structureStride, int structureCount, StructuredBufferFlags flags) : base(device)
 {
     Create(device, structureStride, structureCount, flags);
 }
예제 #3
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="rs"></param>
 /// <param name="elementCount"></param>
 /// <param name="elementType"></param>
 public StructuredBuffer(GraphicsDevice device, Type structureType, int structureCount, StructuredBufferFlags flags) : base(device)
 {
     Create(device, Marshal.SizeOf(structureType), structureCount, flags);
 }
예제 #4
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="rs"></param>
 /// <param name="elementCount"></param>
 /// <param name="elementType"></param>
 public FormattedBuffer(GraphicsDevice device, VertexFormat format, int elementsCount, StructuredBufferFlags flags) : base(device)
 {
     Create(device, format, elementsCount, flags);
 }