internal static RenderTargetObject CreateSwapchainTarget(LightDevice device) { var ret = new RenderTargetObject(device); ret._type = RenderTargetObjectType.SwapchainTarget; ret._isDepthStencil = false; ret.RebuildView(); return(ret); }
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); }
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); }
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(); } }
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]; }
public RenderTargetObject CreateTextureTarget() { return(RenderTargetObject.CreateTextureTarget(this, 87 /*DXGI_FORMAT_B8G8R8A8_UNORM*/)); }
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); }