Exemplo n.º 1
0
        internal static RenderTargetObject CreateSwapchainTarget(LightDevice device)
        {
            var ret = new RenderTargetObject(device);

            ret._type           = RenderTargetObjectType.SwapchainTarget;
            ret._isDepthStencil = false;
            ret.RebuildView();
            return(ret);
        }
Exemplo n.º 2
0
        internal static RenderTargetObject CreateTextureTarget(LightDevice device, int format)
        {
            var ret = new RenderTargetObject(device);

            ret._type           = RenderTargetObjectType.TextureTarget;
            ret._isDepthStencil = false;
            ret._formatTexture  = format;
            ret._formatTarget   = format;
            ret._formatResource = format;
            ret._textureObj     = new Texture2D(device, IntPtr.Zero, IntPtr.Zero, 0, 0, false);
            ret.RebuildView();
            return(ret);
        }
Exemplo n.º 3
0
        internal static RenderTargetObject CreateDepthStencilTarget(LightDevice device,
                                                                    int formatTexture, int formatTarget, int formatResource)
        {
            var ret = new RenderTargetObject(device);

            ret._type           = RenderTargetObjectType.TextureTarget;
            ret._isDepthStencil = true;
            ret._formatTexture  = formatTexture;
            ret._formatTarget   = formatTarget;
            ret._formatResource = formatResource;
            ret.RebuildView();
            return(ret);
        }
Exemplo n.º 4
0
 public RenderTargetObject CreateDepthStencilTarget(int depthSize = 24, int stencilSize = 8)
 {
     if (depthSize == 24 && stencilSize == 8)
     {
         return(RenderTargetObject.CreateDepthStencilTarget(this,
                                                            44 /* DXGI_FORMAT_R24G8_TYPELESS */,
                                                            45 /* DXGI_FORMAT_D24_UNORM_S8_UINT */,
                                                            46 /* DXGI_FORMAT_R24_UNORM_X8_TYPELESS */));
     }
     else if (depthSize == 32 && stencilSize == 0)
     {
         return(RenderTargetObject.CreateDepthStencilTarget(this,
                                                            39 /* DXGI_FORMAT_R32_TYPELESS */,
                                                            40 /* DXGI_FORMAT_D32_FLOAT */,
                                                            41 /* DXGI_FORMAT_R32_FLOAT */));
     }
     else
     {
         throw new ArgumentOutOfRangeException();
     }
 }
Exemplo n.º 5
0
        public RenderTargetList(params RenderTargetObject[] renderTargetObjects)
        {
            if (renderTargetObjects.Length < 1)
            {
                throw new ArgumentException(nameof(renderTargetObjects));
            }
            LightDevice device = renderTargetObjects[0].Device;
            int         renderTarget = 0, depthStencil = 0;

            if (renderTargetObjects[0].IsDepthStencil)
            {
                depthStencil += 1;
            }
            else
            {
                renderTarget += 1;
            }
            for (int i = 1; i < renderTargetObjects.Length; ++i)
            {
                if (renderTargetObjects[i].Device != device)
                {
                    throw new ArgumentException("target not from same device");
                }
                if (renderTargetObjects[i].IsDepthStencil)
                {
                    depthStencil += 1;
                }
                else
                {
                    renderTarget += 1;
                }
            }
            if (renderTarget == 0 || depthStencil > 1)
            {
                throw new ArgumentException("invalid target type");
            }
            _renderTargets = renderTargetObjects.Where(t => !t.IsDepthStencil).ToArray();
            _depthStencil  = renderTargetObjects.FirstOrDefault(t => t.IsDepthStencil);
            _viewPtr       = new IntPtr[_renderTargets.Length];
        }
Exemplo n.º 6
0
 public RenderTargetObject CreateTextureTarget()
 {
     return(RenderTargetObject.CreateTextureTarget(this, 87 /*DXGI_FORMAT_B8G8R8A8_UNORM*/));
 }
Exemplo n.º 7
0
        public unsafe static LightDevice Create(Control ctrl, int initWidth = -1, int initHeight = -1)
        {
            var ret = new LightDevice();

            //initialize size
            {
                var width  = initWidth == -1 ? ctrl.ClientSize.Width : initWidth;
                var height = initHeight == -1 ? ctrl.ClientSize.Height : initHeight;

                ret._ctrl   = ctrl;
                ret._form   = ctrl.FindForm();
                ret._width  = width;
                ret._height = height;
                ret._dpi    = GetDpiForWindow(ret._form.Handle);
            }

            try
            {
                using (var adapter = new ComScopeGuard())
                {
                    //Find the adapter
                    adapter.Ptr = GetAdapter();

                    //create core objects
                    IntPtr swapChain, device, immediateContext;
                    {
                        var d = new SwapChainDescription(ctrl.Handle, ret._width, ret._height);

                        Native.D3D11CreateDeviceAndSwapChain(
                            adapter.Ptr, adapter.Ptr == IntPtr.Zero ? 1u : 0u,
                            IntPtr.Zero, 0, IntPtr.Zero, 0, 7, ref d,
                            out swapChain, out device, out var featureLevel, out immediateContext).Check();

                        ret._device    = device;
                        ret._swapchain = swapChain;
                        ret._context   = immediateContext;
                    }

                    //get default render target
                    IntPtr renderView;
                    {
                        using (var backBuffer = new ComScopeGuard())
                        {
                            SwapChain.GetBuffer(swapChain, 0, Guids.Texture2D, out backBuffer.Ptr).Check();
                            Device.CreateRenderTargetView(device, backBuffer.Ptr, null, out renderView).Check();
                        }
                        ret._defaultRenderView = renderView;
                    }

                    //get DXGI.Output
                    {
                        var i = Adapter.EnumOutputs(adapter.Ptr, 0, out var output);
                        //Sometimes this can fail, but it should not affect our other functions.
                        //TODO Actually we should think of supporting multiple outputs.
                        if (i != 0x887A0002)
                        {
                            i.Check();
                        }
                        ret._output = output;
                    }

                    ret._defaultRenderTarget = RenderTargetObject.CreateSwapchainTarget(ret);
                    ret.AddEventHandlers();
                }
            }
            catch (NativeException e)
            {
                ret.Dispose(true);
                throw e;
            }
            return(ret);
        }