public void UpdateRenderTargetSize(CanvasDevice device, GameGeometry geometry) { RenderTargetAspectRatio = geometry.AspectRatio; if (RenderTargetAspectRatio < 0.1f) { RenderTargetAspectRatio = (float)(geometry.BaseWidth) / geometry.BaseHeight; } if (RenderTarget != null) { var currentSize = RenderTarget.Size; if (currentSize.Width >= geometry.MaxWidth && currentSize.Height >= geometry.MaxHeight) { return; } } lock (RenderTargetLock) { var size = Math.Max(Math.Max(geometry.MaxWidth, geometry.MaxHeight), RenderTargetMinSize); size = ClosestGreaterPowerTwo(size); RenderTarget?.Dispose(); RenderTargetSurface?.Dispose(); RenderTargetSurface = D3DSurfaceMap.CreateMappableD3DSurface(device, size, size); RenderTarget = CanvasBitmap.CreateFromDirect3D11Surface(device, RenderTargetSurface); } }
public unsafe void UpdateFromCoreOutputXRGB8888(CanvasDevice device, IReadOnlyList <uint> data, uint width, uint height, ulong pitch) { if (data == null || RenderTarget == null || CurrentCorePixelSize == 0) { return; } lock (RenderTargetLock) { RenderTargetViewport.Width = width; RenderTargetViewport.Height = height; using (var renderTargetMap = new D3DSurfaceMap(device, RenderTargetSurface)) { var dataPtr = (byte *)new IntPtr(renderTargetMap.Data).ToPointer(); FramebufferConverter.ConvertFrameBufferXRGB8888(width, height, data, (int)pitch, dataPtr, (int)renderTargetMap.PitchBytes); } } }