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; } } }
/// <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); } } }