public void Update(DX11RenderContext context)
        {
            if (FInvalidate || !FOutput[0].Contains(context) || FElCount.IsChanged || FImmut.IsChanged)
            {
                if (FOutput[0].Contains(context))
                {
                    if (FOutput[0][context].ElementCount != elcount)
                    {
                        FOutput[0].Dispose(context);
                    }
                }
                else
                {
                    if (FImmut[0])
                    {
                        FInData.Position = 0;
                        FInData.Read(immutbuf, 0, (int)FInData.Length);
                        var ds = new DataStream(immutbuf, true, true);
                        ds.Position         = 0;
                        FOutput[0][context] = new DX11ImmutableStructuredBuffer(context.Device, elcount, elstrides, ds);
                    }
                    else
                    {
                        FOutput[0][context] = new DX11DynamicStructuredBuffer(context.Device, elcount, elstrides);
                    }
                    FValid[0] = true;
                }

                var b = FOutput[0][context];
                try
                {
                    if (FImmut[0])
                    {
                        if (FOutput[0][context] != null)
                        {
                            FOutput[0][context].Dispose();
                        }
                        FInData.Position = 0;
                        FInData.Read(immutbuf, 0, (int)FInData.Length);
                        var ds = new DataStream(immutbuf, true, true);
                        ds.Position         = 0;
                        FOutput[0][context] = new DX11ImmutableStructuredBuffer(context.Device, elcount, elstrides, ds);
                    }
                    else
                    {
                        var db = context.CurrentDeviceContext.MapSubresource(b.Buffer, MapMode.WriteDiscard,
                                                                             MapFlags.None);
                        db.Data.Position = 0;
                        FInData.Position = 0;
                        FInData.CopyTo(db.Data);
                        db.Data.Position = 0;
                        context.CurrentDeviceContext.UnmapSubresource(b.Buffer, 0);
                    }
                }
                catch
                {
                    FValid[0] = false;
                }
            }
        }
Exemple #2
0
 /// <summary>
 /// Creates a buffer.
 /// </summary>
 /// <typeparam name="T"></typeparam>
 /// <param name="bufferResource">The buffer resource</param>
 /// <param name="context">The DX11 context.</param>
 /// <param name="count">The required count. Gets blown up to the next power of 2.</param>
 /// <param name="bufferToCopy">The buffer to copy in case of immutable buffer type</param>
 private void CreateBuffer <T>(DX11Resource <IDX11ReadableStructureBuffer> bufferResource, DX11RenderContext context, int count, T[] bufferToCopy)
     where T : struct
 {
     if (!bufferResource.Contains(context))
     {
         count = NextUpperPow2(count);
         if (this.FBufferType[0] == DX11BufferUploadType.Dynamic)
         {
             bufferResource[context] = new DX11DynamicStructuredBuffer <T>(context, count);
         }
         else if (this.FBufferType[0] == DX11BufferUploadType.Default)
         {
             bufferResource[context] = new DX11CopyDestStructuredBuffer <T>(context, count);
         }
         else
         {
             bufferResource[context] = new DX11ImmutableStructuredBuffer <T>(context.Device, bufferToCopy, count);
         }
     }
 }