示例#1
0
        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);
            }
        }
示例#2
0
        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);
                }
            }
        }