public void Dispose() { _currentFrame?.Dispose(); _dx?.RemoveRef(); _currentFrame = null; _dx = null; }
private void DownloadAndDisplayAsBitmap(DirectXResource res) { int width = res.Texture2D.Description.Width; int height = res.Texture2D.Description.Height; var dx = res.GetDx(); PrepareSoftwareImage(width, height, PixelFormats.Bgra32); if (_cpuTexture == null || _cpuTexture.Texture2D == null || _cpuTexture.Texture2D.Description.Width != width || _cpuTexture.Texture2D.Description.Height != height || _cpuTextureOwner != dx) { _cpuTexture?.Dispose(); _cpuTextureOwner = dx; _cpuTexture = dx.Pool.Get("uiCpu", DirectXResource.Desc(width, height, SharpDX.DXGI.Format.B8G8R8A8_UNorm, BindFlags.None, ResourceUsage.Staging, ResourceOptionFlags.None, CpuAccessFlags.Read)); } DataBox db = new DataBox(); dx.RunOnContext(ctx => { ctx.CopyResource(res.Texture2D, _cpuTexture.Texture2D); ctx.Flush(); db = ctx.MapSubresource(_cpuTexture.Texture2D, 0, MapMode.Read, MapFlags.None); }, "Download for ui"); if (db.SlicePitch > 0) { _softwareImage.WritePixels(new Int32Rect(0, 0, width, height), db.DataPointer, db.SlicePitch, db.RowPitch); } dx.RunOnContext(ctx => ctx.UnmapSubresource(_cpuTexture.Texture2D, 0), "Unmap for ui"); if (Source != _softwareImage) { Source = _softwareImage; } }