private static void TakeCustomSizedScreenshot(Vector2 rescale) { IRtvTexture m_finalImage; var resCpy = m_resolution; m_resolution = new Vector2I(resCpy * rescale); CreateScreenResources(); IBorrowedRtvTexture dummy; m_finalImage = DrawGameScene(null, out dummy); dummy.Release(); m_resetEyeAdaptation = true; MyBorrowedRwTextureManager texManager = MyManagers.RwTexturesPool; var surface = texManager.BorrowRtv("MyRender11.TakeCustomSizedScreenshot", m_finalImage.Size.X, m_finalImage.Size.Y, SharpDX.DXGI.Format.R8G8B8A8_UNorm_SRgb, 1, 0); MyCopyToRT.Run(surface, m_finalImage); MyCopyToRT.ClearAlpha(surface); SaveScreenshotFromResource(surface); surface.Release(); m_resolution = resCpy; CreateScreenResources(); }
internal static unsafe void InitSubsystems() { InitializeBlendStates(); InitializeRasterizerStates(); InitilizeSamplerStates(); MyCommon.Init(); MyPipelineStates.Init(); MyTextures.Init(); MyVertexLayouts.Init(); MyShaders.Init(); MyRwTextures.Init(); MyHwBuffers.Init(); MyMeshes.Init(); MyMeshTableSRV.Init(); MyMergeInstancing.Init(); MyGeometryRenderer.Init(); MyLightRendering.Init(); MyShadows.Init(); MyLinesRenderer.Init(); MySpritesRenderer.Init(); MyPrimitivesRenderer.Init(); MyFoliageRenderer.Init(); MyOutline.Init(); MyComponents.Init(); MyBillboardRenderer.Init(); // hardcoded limits MyDebugRenderer.Init(); MyGPUFoliageGenerating.Init(); MyScreenDecals.Init(); MyEnvProbeProcessing.Init(); MyShadowsResolve.Init(); MyAtmosphereRenderer.Init(); MyAAEdgeMarking.Init(); MyScreenPass.Init(); MyCopyToRT.Init(); MyBlendTargets.Init(); MyFXAA.Init(); MyDepthResolve.Init(); MyBloom.Init(); MyLuminanceAverage.Init(); MyToneMapping.Init(); MySSAO.Init(); MyHdrDebugTools.Init(); MySceneMaterials.Init(); MyMaterials1.Init(); MyVoxelMaterials1.Init(); MyMeshMaterials1.Init(); //MyShaderFactory.RunCompilation(); // rebuild }
internal static unsafe void InitSubsystems() { MyRwTextures.Init(); MyHwBuffers.Init(); MyPipelineStates.Init(); ResetShadows(MyRenderProxy.Settings.ShadowCascadeCount, RenderSettings.ShadowQuality.ShadowCascadeResolution()); MyRender11.Init(); MyCommon.Init(); SamplerStates.Init(); MyDepthStencilState.Init(); MyTextures.Init(); MyVertexLayouts.Init(); MyShaders.Init(); MyMeshes.Init(); MyMeshTableSRV.Init(); MyLightRendering.Init(); MyLinesRenderer.Init(); MySpritesRenderer.Init(); MyPrimitivesRenderer.Init(); MyOutline.Init(); MyBlur.Init(); MyTransparentRendering.Init(); MyFoliageComponents.Init(); MyBillboardRenderer.Init(); // hardcoded limits MyDebugRenderer.Init(); MyScreenDecals.Init(); MyEnvProbeProcessing.Init(); MyAtmosphereRenderer.Init(); MyCloudRenderer.Init(); MyAAEdgeMarking.Init(); MyScreenPass.Init(); MyCopyToRT.Init(); MyBlendTargets.Init(); MyFXAA.Init(); MyDepthResolve.Init(); MyBloom.Init(); MyLuminanceAverage.Init(); MyToneMapping.Init(); MySSAO.Init(); MyPlanetBlur.Init(); MyHdrDebugTools.Init(); MySceneMaterials.Init(); MyMaterials1.Init(); MyVoxelMaterials1.Init(); MyMeshMaterials1.Init(); }
private static void TakeCustomSizedScreenshot(Vector2 rescale) { var resCpy = m_resolution; m_resolution = new Vector2I(resCpy * rescale); CreateScreenResources(); m_finalImage = DrawGameScene(null); m_resetEyeAdaptation = true; var surface = new MyRenderTarget(m_finalImage.GetSize().X, m_finalImage.GetSize().Y, SharpDX.DXGI.Format.R8G8B8A8_UNorm_SRgb, 1, 0); MyCopyToRT.Run(surface, m_finalImage); MyCopyToRT.ClearAlpha(surface); SaveScreenshotFromResource(surface.m_resource); surface.Release(); m_resolution = resCpy; CreateScreenResources(); }
internal static unsafe void InitSubsystems() { MyManagers.OnDeviceInit(); //MyRwTextures.Init(); MyHwBuffers.Init(); ResetShadows(MyShadowCascades.Settings.NewData.CascadesCount, RenderSettings.ShadowQuality.ShadowCascadeResolution()); MyRender11.Init(); MyCommon.Init(); MyVertexLayouts.Init(); MyShaders.Init(); MyMeshes.Init(); MyMeshTableSrv.Init(); MyLightRendering.Init(); MyLinesRenderer.Init(); MySpritesRenderer.Init(); MyPrimitivesRenderer.Init(); MyOutline.Init(); MyBlur.Init(); MyTransparentRendering.Init(); MyFoliageComponents.Init(); MyBillboardRenderer.Init(); // hardcoded limits MyDebugRenderer.Init(); MyScreenDecals.Init(); MyEnvProbeProcessing.Init(); MyAtmosphereRenderer.Init(); MyCloudRenderer.Init(); MyAAEdgeMarking.Init(); MyScreenPass.Init(); MyCopyToRT.Init(); MyBlendTargets.Init(); MyFXAA.Init(); MyDepthResolve.Init(); MyBloom.Init(); MyLuminanceAverage.Init(); MyToneMapping.Init(); MySSAO.Init(); MyHdrDebugTools.Init(); MySceneMaterials.Init(); MyMaterials1.Init(); MyVoxelMaterials1.Init(); MyMeshMaterials1.Init(); MyHBAO.Init(); try { if (m_settings.UseStereoRendering) { var openVR = new MyOpenVR(); MyStereoStencilMask.InitUsingOpenVR(); } } catch (System.Exception e) { if (!VRage.MyCompilationSymbols.DX11ForceStereo) { throw; } MyStereoStencilMask.InitUsingUndefinedMask(); } }
internal static void Present() { if (m_swapchain != null) { if (m_screenshot.HasValue) { if (m_screenshot.Value.SizeMult == VRageMath.Vector2.One) { MyCopyToRT.ClearAlpha(Backbuffer); SaveScreenshotFromResource(Backbuffer.m_resource); } else { TakeCustomSizedScreenshot(m_screenshot.Value.SizeMult); } } GetRenderProfiler().StartProfilingBlock("Waiting for present"); try { m_swapchain.Present(m_settings.VSync ? 1 : 0, 0); m_consecutivePresentFails = 0; if (m_presentTimer == null) { m_presentTimer = new Stopwatch(); } else { m_presentTimer.Stop(); if (m_presentTimes.Count >= PresentTimesStored) { m_presentTimes.Dequeue(); } m_presentTimes.Enqueue(m_presentTimer.ElapsedMilliseconds); } m_presentTimer.Restart(); } catch (SharpDXException e) { Log.WriteLine("Device removed - resetting device; reason: " + e.ToString()); HandleDeviceReset(); Log.WriteLine("Device removed - resetting completed"); m_consecutivePresentFails++; if (m_consecutivePresentFails == 5) { Log.WriteLine("Present failed"); Log.IncreaseIndent(); if (e.Descriptor == SharpDX.DXGI.ResultCode.DeviceRemoved) { Log.WriteLine("Device removed: " + Device.DeviceRemovedReason); } var timings = ""; while (m_presentTimes.Count > 0) { timings += m_presentTimes.Dequeue(); if (m_presentTimes.Count > 0) { timings += ", "; } } Log.WriteLine("Last present timings = [ " + timings + " ]"); Log.DecreaseIndent(); } } GetRenderProfiler().EndProfilingBlock(); if (m_profilingStarted) { MyGpuProfiler.IC_EndBlock(); } MyGpuProfiler.EndFrame(); MyGpuProfiler.StartFrame(); m_profilingStarted = true; // waiting for change to fullscreen - window migh overlap or some other dxgi excuse to fail :( TryChangeToFullscreen(); } }
private static void DrawGameScene(bool blitToBackbuffer) { ResetStats(); MyCommon.UpdateFrameConstants(); // todo: shouldn't be necessary if (true) { MyImmediateRC.RC.Clear(); MyImmediateRC.RC.Context.ClearState(); } MyRender11.GetRenderProfiler().StartProfilingBlock("MyGeometryRenderer.Render"); MyGpuProfiler.IC_BeginBlock("MyGeometryRenderer.Render"); MyGeometryRenderer.Render(); MyGpuProfiler.IC_EndBlock(); MyRender11.GetRenderProfiler().EndProfilingBlock(); // cleanup context atfer deferred lists if (MyRender11.DeferredContextsEnabled) { MyImmediateRC.RC.Clear(); } // todo: shouldn't be necessary if (true) { MyImmediateRC.RC.Clear(); MyImmediateRC.RC.Context.ClearState(); } MyRender11.GetRenderProfiler().StartProfilingBlock("Render decals"); MyGpuProfiler.IC_BeginBlock("Render decals"); MyRender11.CopyGbufferToScratch(); MyScreenDecals.Draw(); MyGpuProfiler.IC_EndBlock(); MyRender11.GetRenderProfiler().EndProfilingBlock(); MyRender11.GetRenderProfiler().StartProfilingBlock("Render foliage"); MyGpuProfiler.IC_BeginBlock("Render foliage"); MyFoliageRenderer.Render(); MyGpuProfiler.IC_EndBlock(); MyRender11.GetRenderProfiler().EndProfilingBlock(); MySceneMaterials.MoveToGPU(); MyRender11.GetRenderProfiler().StartProfilingBlock("Postprocessing"); MyGpuProfiler.IC_BeginBlock("Postprocessing"); if (MultisamplingEnabled) { MyRender11.Context.ClearDepthStencilView(MyScreenDependants.m_resolvedDepth.m_DSV, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1, 0); MyGpuProfiler.IC_BeginBlock("MarkAAEdges"); MyAAEdgeMarking.Run(); MyGpuProfiler.IC_EndBlock(); MyDepthResolve.Run(MyScreenDependants.m_resolvedDepth, MyGBuffer.Main.DepthStencil.Depth); } MyGpuProfiler.IC_BeginBlock("MarkCascades"); MyShadows.MarkCascadesInStencil(); MyGpuProfiler.IC_EndBlock(); MyGpuProfiler.IC_BeginBlock("Shadows resolve"); MyShadowsResolve.Run(); MyGpuProfiler.IC_EndBlock(); MyGpuProfiler.IC_BeginBlock("SSAO"); if (Postprocess.EnableSsao) { MySSAO.Run(MyScreenDependants.m_ambientOcclusion, MyGBuffer.Main, MyRender11.MultisamplingEnabled ? MyScreenDependants.m_resolvedDepth.Depth : MyGBuffer.Main.DepthStencil.Depth); } else { MyRender11.Context.ClearRenderTargetView(MyScreenDependants.m_ambientOcclusion.m_RTV, Color4.White); } MyGpuProfiler.IC_EndBlock(); MyGpuProfiler.IC_BeginBlock("Lights"); MyLightRendering.Render(); MyGpuProfiler.IC_EndBlock(); MyRender11.GetRenderProfiler().StartProfilingBlock("Billboards"); MyGpuProfiler.IC_BeginBlock("Billboards"); MyRender11.Context.ClearRenderTargetView((MyScreenDependants.m_particlesRT as IRenderTargetBindable).RTV, new Color4(0, 0, 0, 0)); if (MyRender11.MultisamplingEnabled) { MyBillboardRenderer.Render(MyScreenDependants.m_particlesRT, MyScreenDependants.m_resolvedDepth, MyScreenDependants.m_resolvedDepth.Depth); } else { MyBillboardRenderer.Render(MyScreenDependants.m_particlesRT, MyGBuffer.Main.DepthStencil, MyGBuffer.Main.DepthStencil.Depth); } MyBlendTargets.Run(MyGBuffer.Main.Get(MyGbufferSlot.LBuffer), MyScreenDependants.m_particlesRT, MyRender11.BlendAlphaPremult); MyGpuProfiler.IC_EndBlock(); MyRender11.GetRenderProfiler().EndProfilingBlock(); MyAtmosphereRenderer.Render(); MyGpuProfiler.IC_BeginBlock("Luminance reduction"); MyBindableResource avgLum = null; if (MyRender11.MultisamplingEnabled) { //MyLBufferResolve.Run(MyGBuffer.Main.Get(MyGbufferSlot.LBufferResolved), MyGBuffer.Main.Get(MyGbufferSlot.LBuffer), MyGBuffer.Main.DepthStencil.Stencil); MyImmediateRC.RC.Context.ResolveSubresource(MyGBuffer.Main.Get(MyGbufferSlot.LBuffer).m_resource, 0, MyGBuffer.Main.Get(MyGbufferSlot.LBufferResolved).m_resource, 0, SharpDX.DXGI.Format.R11G11B10_Float); } if (m_resetEyeAdaptation) { MyImmediateRC.RC.Context.ClearUnorderedAccessView(m_prevLum.m_UAV, Int4.Zero); m_resetEyeAdaptation = false; } avgLum = MyLuminanceAverage.Run(m_reduce0, m_reduce1, MyGBuffer.Main.Get(MyGbufferSlot.LBuffer), m_prevLum, m_localLum); MyGpuProfiler.IC_EndBlock(); if (MyRender11.Settings.DispalyHdrDebug) { var src = MyGBuffer.Main.Get(MyGbufferSlot.LBuffer) as MyRenderTarget; MyHdrDebugTools.CreateHistogram(src.m_SRV, src.m_resolution, src.m_samples.X); } MyGpuProfiler.IC_BeginBlock("Bloom"); var bloom = MyBloom.Run(MyGBuffer.Main.Get(MyGbufferSlot.LBuffer), avgLum); MyGpuProfiler.IC_EndBlock(); MyBindableResource tonemapped; if (MyRender11.FxaaEnabled) { tonemapped = m_rgba8_linear; } else { tonemapped = m_uav3; } MyGpuProfiler.IC_BeginBlock("Tone mapping"); MyToneMapping.Run(tonemapped, MyGBuffer.Main.Get(MyGbufferSlot.LBuffer), avgLum, bloom, MyRender11.Settings.EnableTonemapping && Postprocess.EnableTonemapping && MyRender11.RenderSettings.TonemappingEnabled); MyGpuProfiler.IC_EndBlock(); MyBindableResource renderedImage; if (MyRender11.FxaaEnabled) { MyGpuProfiler.IC_BeginBlock("FXAA"); MyFXAA.Run(m_rgba8_0.GetView(new MyViewKey { Fmt = SharpDX.DXGI.Format.R8G8B8A8_UNorm, View = MyViewEnum.RtvView }), tonemapped); MyGpuProfiler.IC_EndBlock(); renderedImage = m_rgba8_0.GetView(new MyViewKey { Fmt = SharpDX.DXGI.Format.R8G8B8A8_UNorm_SRgb, View = MyViewEnum.SrvView }); } else { //renderedImage = (tonemapped as MyCustomTexture).GetView(new MyViewKey { Fmt = SharpDX.DXGI.Format.R8G8B8A8_UNorm_SRgb, View = MyViewEnum.SrvView }); renderedImage = tonemapped; } if (MyOutline.AnyOutline()) { MyOutline.Run(); if (MyRender11.FxaaEnabled) { MyBlendTargets.RunWithStencil(m_rgba8_0.GetView(new MyViewKey { Fmt = SharpDX.DXGI.Format.R8G8B8A8_UNorm_SRgb, View = MyViewEnum.RtvView }), MyRender11.m_rgba8_1, MyRender11.BlendAdditive); } else { if (MyRender11.MultisamplingEnabled) { MyBlendTargets.RunWithPixelStencilTest(tonemapped, MyRender11.m_rgba8_1, MyRender11.BlendAdditive); } else { MyBlendTargets.RunWithStencil(tonemapped, MyRender11.m_rgba8_1, MyRender11.BlendAdditive); } } } m_finalImage = renderedImage; if (blitToBackbuffer) { MyCopyToRT.Run(Backbuffer, renderedImage); } if (MyRender11.Settings.DispalyHdrDebug) { MyHdrDebugTools.DisplayHistogram(Backbuffer.m_RTV, (avgLum as IShaderResourceBindable).SRV); } MyGpuProfiler.IC_EndBlock(); MyRender11.GetRenderProfiler().EndProfilingBlock(); }
// Returns the final image and copies it to renderTarget if non-null private static MyBindableResource DrawGameScene(MyBindableResource renderTarget) { MyGpuProfiler.IC_BeginBlock("Clear & Geometry Render"); PrepareGameScene(); // todo: shouldn't be necessary if (true) { ProfilerShort.Begin("Clear"); MyRenderContext.Immediate.Clear(); MyRenderContext.Immediate.DeviceContext.ClearState(); ProfilerShort.End(); } if (MyStereoRender.Enable && MyStereoRender.EnableUsingStencilMask) { ProfilerShort.Begin("MyStereoStencilMask.Draw"); MyGpuProfiler.IC_BeginBlock("MyStereoStencilMask.Draw"); MyStereoStencilMask.Draw(); MyGpuProfiler.IC_EndBlock(); ProfilerShort.End(); } MyGpuProfiler.IC_BeginBlock("MyGeometryRenderer.Render"); Debug.Assert(m_commandLists.Count == 0, "Not all command lists executed last frame!"); ProfilerShort.Begin("DynamicGeometryRenderer"); DynamicGeometryRenderer.Render(m_commandLists, true); ProfilerShort.End(); // End function block if (MyScene.SeparateGeometry) { ProfilerShort.Begin("StaticGeometryRenderer"); StaticGeometryRenderer.Render(m_commandLists, false); ProfilerShort.End(); // End function block } SendGlobalOutputMessages(); ExecuteCommandLists(m_commandLists); MyGpuProfiler.IC_EndBlock(); #if !UNSHARPER_TMP MyEnvironmentProbe.FinalizeEnvProbes(); #endif // cleanup context atfer deferred lists if (MyRender11.DeferredContextsEnabled) { ProfilerShort.Begin("Clear2"); MyRenderContext.Immediate.Clear(); ProfilerShort.End(); } // todo: shouldn't be necessary if (true) { ProfilerShort.Begin("Clear3"); MyRenderContext.Immediate.Clear(); MyRenderContext.Immediate.DeviceContext.ClearState(); ProfilerShort.End(); } MyGpuProfiler.IC_EndBlock(); ProfilerShort.Begin("Render decals - Opaque"); MyGpuProfiler.IC_BeginBlock("Render decals - Opaque"); MyRender11.CopyGbufferToScratch(); MyScreenDecals.Draw(false); MyGpuProfiler.IC_EndBlock(); ProfilerShort.BeginNextBlock("Render foliage"); MyGpuProfiler.IC_BeginBlock("Render foliage"); m_foliageRenderer.Render(); MyGpuProfiler.IC_EndBlock(); MyGpuProfiler.IC_BeginBlock("GBuffer Resolve"); ProfilerShort.BeginNextBlock("MySceneMaterials.MoveToGPU"); MySceneMaterials.MoveToGPU(); int nPasses = MyStereoRender.Enable ? 2 : 1; for (int i = 0; i < nPasses; i++) { if (MyStereoRender.Enable) { MyStereoRender.RenderRegion = i == 0 ? MyStereoRegion.LEFT : MyStereoRegion.RIGHT; } if (MultisamplingEnabled) { MyRender11.DeviceContext.ClearDepthStencilView(MyScreenDependants.m_resolvedDepth.m_DSV, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1, 0); MyGpuProfiler.IC_BeginBlock("MarkAAEdges"); MyAAEdgeMarking.Run(); MyGpuProfiler.IC_EndBlock(); MyDepthResolve.Run(MyScreenDependants.m_resolvedDepth, MyGBuffer.Main.DepthStencil.Depth); } ProfilerShort.BeginNextBlock("Shadows"); MyGpuProfiler.IC_BeginBlock("Shadows"); if (MyScene.SeparateGeometry) { MyShadowCascadesPostProcess.Combine(MyShadowCascades.CombineShadowmapArray, DynamicShadows.ShadowCascades, StaticShadows.ShadowCascades); DynamicShadows.ShadowCascades.PostProcess(MyRender11.PostProcessedShadows, MyShadowCascades.CombineShadowmapArray); } else { DynamicShadows.ShadowCascades.PostProcess(MyRender11.PostProcessedShadows, DynamicShadows.ShadowCascades.CascadeShadowmapArray); } MyGpuProfiler.IC_EndBlock(); ProfilerShort.BeginNextBlock("SSAO"); MyGpuProfiler.IC_BeginBlock("SSAO"); if (Postprocess.EnableSsao && m_debugOverrides.Postprocessing && m_debugOverrides.SSAO) { MySSAO.Run(MyScreenDependants.m_ambientOcclusion, MyGBuffer.Main, MyRender11.MultisamplingEnabled ? MyScreenDependants.m_resolvedDepth.Depth : MyGBuffer.Main.DepthStencil.Depth); if (MySSAO.UseBlur) { MyBlur.Run(MyScreenDependants.m_ambientOcclusion, MyScreenDependants.m_ambientOcclusionHelper, MyScreenDependants.m_ambientOcclusion); } } else { MyRender11.DeviceContext.ClearRenderTargetView(MyScreenDependants.m_ambientOcclusion.m_RTV, Color4.White); } MyGpuProfiler.IC_EndBlock(); ProfilerShort.BeginNextBlock("Lights"); MyGpuProfiler.IC_BeginBlock("Lights"); if (m_debugOverrides.Lighting) { MyLightRendering.Render(); } MyGpuProfiler.IC_EndBlock(); if (MyRender11.DebugOverrides.Flares) { MyLightRendering.DrawFlares(); } } MyStereoRender.RenderRegion = MyStereoRegion.FULLSCREEN; MyGpuProfiler.IC_EndBlock(); // Rendering for VR is solved inside of Transparent rendering ProfilerShort.BeginNextBlock("Transparent Pass"); MyGpuProfiler.IC_BeginBlock("Transparent Pass"); if (m_debugOverrides.Transparent) { MyTransparentRendering.Render(m_transparencyAccum, m_transparencyCoverage); } MyGpuProfiler.IC_EndBlock(); ProfilerShort.BeginNextBlock("PostProcess"); MyGpuProfiler.IC_BeginBlock("PostProcess"); MyGpuProfiler.IC_BeginBlock("Luminance reduction"); MyBindableResource avgLum = null; if (m_resetEyeAdaptation) { MyRenderContext.Immediate.DeviceContext.ClearUnorderedAccessView(m_prevLum.m_UAV, Int4.Zero); m_resetEyeAdaptation = false; } avgLum = MyLuminanceAverage.Run(m_reduce0, m_reduce1, MyGBuffer.Main.Get(MyGbufferSlot.LBuffer), m_prevLum); MyGpuProfiler.IC_EndBlock(); if (MyRender11.Settings.DisplayHdrDebug) { var src = MyGBuffer.Main.Get(MyGbufferSlot.LBuffer) as MyRenderTarget; MyHdrDebugTools.CreateHistogram(src.m_SRV, src.m_resolution, src.m_samples.X); } MyGpuProfiler.IC_BeginBlock("Bloom"); MyBindableResource bloom; if (m_debugOverrides.Postprocessing && m_debugOverrides.Bloom) { bloom = MyBloom.Run(MyGBuffer.Main.Get(MyGbufferSlot.LBuffer), avgLum); } else { MyRender11.DeviceContext.ClearRenderTargetView(MyRender11.EighthScreenUavHDR.m_RTV, Color4.Black); bloom = MyRender11.EighthScreenUavHDR; } MyGpuProfiler.IC_EndBlock(); MyBindableResource tonemapped; bool fxaa = MyRender11.FxaaEnabled; if (fxaa) { tonemapped = m_rgba8_linear; } else { tonemapped = m_uav3; } MyGpuProfiler.IC_BeginBlock("Tone mapping"); if (m_debugOverrides.Postprocessing && m_debugOverrides.Tonemapping) { MyToneMapping.Run(tonemapped, MyGBuffer.Main.Get(MyGbufferSlot.LBuffer), avgLum, bloom, Postprocess.EnableTonemapping); } else { tonemapped = MyGBuffer.Main.Get(MyGbufferSlot.LBuffer); //MyRender11.DeviceContext.CopyResource(MyGBuffer.Main.Get(MyGbufferSlot.LBuffer).m_resource, tonemapped.m_resource); } MyGpuProfiler.IC_EndBlock(); MyBindableResource renderedImage; if (fxaa) { MyGpuProfiler.IC_BeginBlock("FXAA"); MyFXAA.Run(m_rgba8_0.GetView(new MyViewKey { Fmt = SharpDX.DXGI.Format.R8G8B8A8_UNorm, View = MyViewEnum.RtvView }), tonemapped); MyGpuProfiler.IC_EndBlock(); renderedImage = m_rgba8_0.GetView(new MyViewKey { Fmt = SharpDX.DXGI.Format.R8G8B8A8_UNorm_SRgb, View = MyViewEnum.SrvView }); } else { //renderedImage = (tonemapped as MyCustomTexture).GetView(new MyViewKey { Fmt = SharpDX.DXGI.Format.R8G8B8A8_UNorm_SRgb, View = MyViewEnum.SrvView }); renderedImage = tonemapped; } ProfilerShort.Begin("Outline"); if (MyOutline.AnyOutline()) { MyOutline.Run(); MyGpuProfiler.IC_BeginBlock("Outline Blending"); ProfilerShort.Begin("Outline Blending"); if (fxaa) { MyBlendTargets.RunWithStencil( m_rgba8_0.GetView(new MyViewKey { Fmt = SharpDX.DXGI.Format.R8G8B8A8_UNorm_SRgb, View = MyViewEnum.RtvView }), MyRender11.m_rgba8_1, MyRender11.BlendAdditive, MyDepthStencilState.TestOutlineMeshStencil, 0x40); MyBlendTargets.RunWithStencil( m_rgba8_0.GetView(new MyViewKey { Fmt = SharpDX.DXGI.Format.R8G8B8A8_UNorm_SRgb, View = MyViewEnum.RtvView }), MyRender11.m_rgba8_1, MyRender11.BlendTransparent, MyDepthStencilState.TestHighlightMeshStencil, 0x40); } else { if (MyRender11.MultisamplingEnabled) { MyBlendTargets.RunWithPixelStencilTest(tonemapped, MyRender11.m_rgba8_ms, MyRender11.BlendAdditive); MyBlendTargets.RunWithPixelStencilTest(tonemapped, MyRender11.m_rgba8_ms, MyRender11.BlendTransparent, true); } else { MyBlendTargets.RunWithStencil(tonemapped, MyRender11.m_rgba8_1, MyRender11.BlendAdditive, MyDepthStencilState.TestOutlineMeshStencil, 0x40); MyBlendTargets.RunWithStencil(tonemapped, MyRender11.m_rgba8_1, MyRender11.BlendTransparent, MyDepthStencilState.TestHighlightMeshStencil, 0x40); } } ProfilerShort.End(); MyGpuProfiler.IC_EndBlock(); } ProfilerShort.End(); if (renderTarget != null) { MyCopyToRT.Run(renderTarget, renderedImage); } if (MyRender11.Settings.DisplayHdrDebug) { var target = renderTarget as IRenderTargetBindable; var lum = avgLum as IShaderResourceBindable; if (target != null && lum != null) { MyHdrDebugTools.DisplayHistogram(target.RTV, lum.SRV); } } MyGpuProfiler.IC_EndBlock(); ProfilerShort.End(); return(renderedImage); }
// Returns the final image and copies it to renderTarget if non-null private static IRtvTexture DrawGameScene(IRtvBindable renderTarget) { MyGpuProfiler.IC_BeginBlockAlways("ClearAndGeometryRender"); PrepareGameScene(); // todo: shouldn't be necessary if (true) { ProfilerShort.Begin("Clear"); MyRender11.RC.ClearState(); ProfilerShort.End(); } if (MyStereoRender.Enable && MyStereoRender.EnableUsingStencilMask) { ProfilerShort.Begin("MyStereoStencilMask.Draw"); MyGpuProfiler.IC_BeginBlock("MyStereoStencilMask.Draw"); MyStereoStencilMask.Draw(); MyGpuProfiler.IC_EndBlock(); ProfilerShort.End(); } MyGpuProfiler.IC_BeginBlock("MyGeometryRenderer.Render"); Debug.Assert(m_commandLists.Count == 0, "Not all command lists executed last frame!"); ProfilerShort.Begin("DynamicGeometryRenderer"); DynamicGeometryRenderer.Render(m_commandLists, true); ProfilerShort.End(); // End function block if (MyScene.SeparateGeometry) { ProfilerShort.Begin("StaticGeometryRenderer"); StaticGeometryRenderer.Render(m_commandLists, false); ProfilerShort.End(); // End function block } SendGlobalOutputMessages(); ExecuteCommandLists(m_commandLists); MyGpuProfiler.IC_EndBlock(); #if !UNSHARPER_TMP MyManagers.EnvironmentProbe.FinalizeEnvProbes(); #endif // cleanup context atfer deferred lists if (true) { ProfilerShort.Begin("Clear3"); MyRender11.RC.ClearState(); ProfilerShort.End(); } MyGpuProfiler.IC_EndBlockAlways(); ProfilerShort.Begin("Render decals - Opaque"); MyGpuProfiler.IC_BeginBlock("Render decals - Opaque"); MyImmediateRC.RC.CopyResource(MyGBuffer.Main.GBuffer1.Resource, MyGlobalResources.Gbuffer1Copy.Resource); // copy gbuffer1 MyScreenDecals.Draw(false); MyGpuProfiler.IC_EndBlock(); ProfilerShort.BeginNextBlock("Render foliage"); MyGpuProfiler.IC_BeginBlockAlways("RenderFoliage"); m_foliageRenderer.Render(); MyGpuProfiler.IC_EndBlockAlways(); MyGpuProfiler.IC_BeginBlock("GBuffer Resolve"); ProfilerShort.BeginNextBlock("MySceneMaterials.MoveToGPU"); MySceneMaterials.MoveToGPU(); MyRender11.RC.ResetTargets(); int nPasses = MyStereoRender.Enable ? 2 : 1; for (int i = 0; i < nPasses; i++) { if (MyStereoRender.Enable) { MyStereoRender.RenderRegion = i == 0 ? MyStereoRegion.LEFT : MyStereoRegion.RIGHT; } if (MultisamplingEnabled) { MyRender11.RC.ClearDsv(MyScreenDependants.m_resolvedDepth, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1, 0); MyGpuProfiler.IC_BeginBlock("MarkAAEdges"); MyAAEdgeMarking.Run(); MyGpuProfiler.IC_EndBlock(); MyDepthResolve.Run(MyScreenDependants.m_resolvedDepth, MyGBuffer.Main.DepthStencil); } ProfilerShort.BeginNextBlock("Shadows"); MyGpuProfiler.IC_BeginBlockAlways("Shadows"); IBorrowedUavTexture postProcessedShadows; if (MyScene.SeparateGeometry) { MyShadowCascadesPostProcess.Combine(MyShadowCascades.CombineShadowmapArray, DynamicShadows.ShadowCascades, StaticShadows.ShadowCascades); postProcessedShadows = DynamicShadows.ShadowCascades.PostProcess(MyShadowCascades.CombineShadowmapArray); //MyShadowCascadesPostProcess.Combine(MyShadowCascades.CombineShadowmapArray, // DynamicShadows.ShadowCascades, StaticShadows.ShadowCascades); //postProcessedShadows = // DynamicShadows.ShadowCascades.PostProcess(MyShadowCascades.CombineShadowmapArray); } else { postProcessedShadows = DynamicShadows.ShadowCascades.PostProcess(DynamicShadows.ShadowCascades.CascadeShadowmapArray); //postProcessedShadows = MyManagers.Shadow.Evaluate(); } MyGpuProfiler.IC_EndBlockAlways(); if (MySSAO.Params.Enabled && m_debugOverrides.Postprocessing && m_debugOverrides.SSAO) { ProfilerShort.BeginNextBlock("SSAO"); MyGpuProfiler.IC_BeginBlockAlways("SSAO"); MySSAO.Run(MyScreenDependants.m_ambientOcclusion, MyGBuffer.Main, MyRender11.MultisamplingEnabled ? MyScreenDependants.m_resolvedDepth.SrvDepth : MyGBuffer.Main.DepthStencil.SrvDepth); if (MySSAO.Params.UseBlur) { MyBlur.Run(MyScreenDependants.m_ambientOcclusion, MyScreenDependants.m_ambientOcclusionHelper, MyScreenDependants.m_ambientOcclusion, clearColor: Color4.White); } MyGpuProfiler.IC_EndBlockAlways(); } else if (MyHBAO.Params.Enabled && m_debugOverrides.Postprocessing && m_debugOverrides.SSAO) { ProfilerShort.BeginNextBlock("HBAO"); MyGpuProfiler.IC_BeginBlock("HBAO"); MyHBAO.Run(MyScreenDependants.m_ambientOcclusion, MyGBuffer.Main, MyRender11.MultisamplingEnabled ? MyScreenDependants.m_resolvedDepth.SrvDepth : MyGBuffer.Main.DepthStencil.SrvDepth); MyGpuProfiler.IC_EndBlock(); } else { MyRender11.RC.ClearRtv(MyScreenDependants.m_ambientOcclusion, Color4.White); } ProfilerShort.BeginNextBlock("Lights"); MyGpuProfiler.IC_BeginBlockAlways("Lights"); if (m_debugOverrides.Lighting) { MyLightRendering.Render(postProcessedShadows); } MyGpuProfiler.IC_EndBlockAlways(); postProcessedShadows.Release(); if (MyRender11.DebugOverrides.Flares) { MyLightRendering.DrawFlares(); } } MyStereoRender.RenderRegion = MyStereoRegion.FULLSCREEN; MyGpuProfiler.IC_EndBlock(); // Rendering for VR is solved inside of Transparent rendering ProfilerShort.BeginNextBlock("Transparent Pass"); MyGpuProfiler.IC_BeginBlockAlways("TransparentPass"); if (m_debugOverrides.Transparent) { MyTransparentRendering.Render(); } MyGpuProfiler.IC_EndBlockAlways(); ProfilerShort.BeginNextBlock("PostProcess"); MyGpuProfiler.IC_BeginBlockAlways("PostProcess"); MyGpuProfiler.IC_BeginBlock("Luminance reduction"); IBorrowedUavTexture avgLum = null; if (MyRender11.Postprocess.EnableEyeAdaptation) { if (m_resetEyeAdaptation) { MyLuminanceAverage.Reset(); m_resetEyeAdaptation = false; } avgLum = MyLuminanceAverage.Run(MyGBuffer.Main.LBuffer); } else { avgLum = MyLuminanceAverage.Skip(); } MyGpuProfiler.IC_EndBlock(); IBorrowedUavTexture histogram = null; if (MyRender11.Settings.DisplayHistogram) { histogram = MyHdrDebugTools.CreateHistogram(MyGBuffer.Main.LBuffer, MyGBuffer.Main.SamplesCount); } if (MyRender11.Settings.DisplayHdrIntensity) { MyHdrDebugTools.DisplayHdrIntensity(MyGBuffer.Main.LBuffer); } MyGpuProfiler.IC_BeginBlock("Bloom"); IBorrowedUavTexture bloom; if (m_debugOverrides.Postprocessing && m_debugOverrides.Bloom) { bloom = MyBloom.Run(MyGBuffer.Main.LBuffer, MyGBuffer.Main.GBuffer2, MyRender11.MultisamplingEnabled ? MyScreenDependants.m_resolvedDepth.SrvDepth : MyGBuffer.Main.DepthStencil.SrvDepth); } else { bloom = MyManagers.RwTexturesPool.BorrowUav("bloom_EightScreenUavHDR", MyRender11.ResolutionI.X / 8, MyRender11.ResolutionI.Y / 8, MyGBuffer.LBufferFormat); MyRender11.RC.ClearRtv(bloom, Color4.Black); } MyGpuProfiler.IC_EndBlock(); MyGpuProfiler.IC_BeginBlock("Tone mapping"); IBorrowedUavTexture tonemapped = MyToneMapping.Run(MyGBuffer.Main.LBuffer, avgLum, bloom, Postprocess.EnableTonemapping && m_debugOverrides.Postprocessing && m_debugOverrides.Tonemapping); bloom.Release(); MyGpuProfiler.IC_EndBlock(); IRtvTexture renderedImage; IBorrowedCustomTexture rgba8_0 = null; bool fxaa = MyRender11.FxaaEnabled; if (fxaa) { rgba8_0 = MyManagers.RwTexturesPool.BorrowCustom("MyRender11.Rgb8_0"); MyGpuProfiler.IC_BeginBlock("FXAA"); MyFXAA.Run(rgba8_0.Linear, tonemapped); MyGpuProfiler.IC_EndBlock(); renderedImage = rgba8_0.SRgb; } else { renderedImage = tonemapped; } ProfilerShort.Begin("Outline"); if (MyOutline.AnyOutline()) { IBorrowedRtvTexture outlined = MyOutline.Run(); MyGpuProfiler.IC_BeginBlock("Outline Blending"); ProfilerShort.Begin("Outline Blending"); if (fxaa) { MyBlendTargets.RunWithStencil( rgba8_0.SRgb, outlined, MyBlendStateManager.BlendAdditive, MyDepthStencilStateManager.TestOutlineMeshStencil, 0x40); MyBlendTargets.RunWithStencil( rgba8_0.SRgb, outlined, MyBlendStateManager.BlendTransparent, MyDepthStencilStateManager.TestHighlightMeshStencil, 0x40); } else { if (MyRender11.MultisamplingEnabled) { MyBlendTargets.RunWithPixelStencilTest(tonemapped, outlined, MyBlendStateManager.BlendAdditive); MyBlendTargets.RunWithPixelStencilTest(tonemapped, outlined, MyBlendStateManager.BlendTransparent, true); } else { MyBlendTargets.RunWithStencil(tonemapped, outlined, MyBlendStateManager.BlendAdditive, MyDepthStencilStateManager.TestOutlineMeshStencil, 0x40); MyBlendTargets.RunWithStencil(tonemapped, outlined, MyBlendStateManager.BlendTransparent, MyDepthStencilStateManager.TestHighlightMeshStencil, 0x40); } } ProfilerShort.End(); MyGpuProfiler.IC_EndBlock(); outlined.Release(); } ProfilerShort.End(); if (renderTarget != null) { MyCopyToRT.Run(renderTarget, renderedImage); } if (MyRender11.Settings.DisplayHistogram) { if (renderTarget != null && avgLum != null) { MyHdrDebugTools.DisplayHistogram(renderTarget, avgLum, histogram); } } MyGpuProfiler.IC_EndBlockAlways(); ProfilerShort.End(); if (rgba8_0 != null) { rgba8_0.Release(); } if (histogram != null) { histogram.Release(); } avgLum.Release(); tonemapped.Release(); // HOTFIX: MyDebugTextureDisplay uses borrowed textures. If we place MyDebugTextureDisplay to the different location, we will have problem with borrowed textures (comment by Michal) ProfilerShort.Begin("MyDebugTextureDisplay.Draw"); MyGpuProfiler.IC_BeginBlock("MyDebugTextureDisplay.Draw"); MyDebugTextureDisplay.Draw(MyRender11.Backbuffer); MyGpuProfiler.IC_EndBlock(); ProfilerShort.End(); return(renderedImage); }
internal static void Present() { if (m_swapchain != null) { GetRenderProfiler().StartProfilingBlock("Screenshot"); if (m_screenshot.HasValue) { if (m_screenshot.Value.SizeMult == VRageMath.Vector2.One) { MyCopyToRT.ClearAlpha(Backbuffer); SaveScreenshotFromResource(Backbuffer); } else { TakeCustomSizedScreenshot(m_screenshot.Value.SizeMult); } } GetRenderProfiler().EndProfilingBlock(); try { MyManagers.OnFrameEnd(); MyGpuProfiler.IC_BeginBlock("Waiting for present"); GetRenderProfiler().StartProfilingBlock("Waiting for present"); m_swapchain.Present(m_settings.VSync ? 1 : 0, 0); GetRenderProfiler().EndProfilingBlock(); MyGpuProfiler.IC_EndBlock(); MyStatsUpdater.Timestamps.Update(ref MyStatsUpdater.Timestamps.Present, ref MyStatsUpdater.Timestamps.PreviousPresent); MyManagers.OnUpdate(); if (VRage.OpenVRWrapper.MyOpenVR.Static != null) { MyGpuProfiler.IC_BeginBlock("OpenVR.FrameDone"); GetRenderProfiler().StartProfilingBlock("OpenVR.FrameDone"); /*var handle=MyOpenVR.GetOverlay("menu"); * MyOpenVR.SetOverlayTexture(handle, MyRender11.Backbuffer.m_resource.NativePointer); */ VRage.OpenVRWrapper.MyOpenVR.FrameDone(); GetRenderProfiler().EndProfilingBlock(); MyGpuProfiler.IC_EndBlock(); } } catch (SharpDXException e) { Log.WriteLine("Graphics device error! Reason:\n" + e.Message); if (e.Descriptor == SharpDX.DXGI.ResultCode.DeviceRemoved) { Log.WriteLine("Device removed reason:\n" + Device.DeviceRemovedReason); } Log.WriteLine("Exception stack trace:\n" + e.StackTrace); StringBuilder sb = new StringBuilder(); foreach (var column in MyRenderStats.m_stats.Values) { foreach (var stats in column) { sb.Clear(); stats.WriteTo(sb); Log.WriteLine(sb.ToString()); } } MyStatsUpdater.UpdateStats(); MyStatsDisplay.WriteTo(sb); Log.WriteLine(sb.ToString()); throw new MyDeviceErrorException("The graphics device encountered a problem.\nSee the log for more details."); } GetRenderProfiler().StartProfilingBlock("GPU profiler"); MyGpuProfiler.EndFrame(); MyGpuProfiler.StartFrame(); GetRenderProfiler().EndProfilingBlock(); // waiting for change to fullscreen - window migh overlap or some other dxgi excuse to fail :( GetRenderProfiler().StartProfilingBlock("TryChangeToFullscreen"); TryChangeToFullscreen(); GetRenderProfiler().EndProfilingBlock(); } }
private unsafe static byte[] GetScreenData(Vector2I resolution, byte[] screenData = null) { const uint headerPadding = 256; // Need to allocate some space for the bitmap headers const uint bytesPerPixel = 4; uint imageSizeInBytes = (uint)(resolution.Size() * bytesPerPixel); uint dataSizeInBytes = imageSizeInBytes + headerPadding; byte[] returnData = null; if (screenData == null) { screenData = new byte[imageSizeInBytes]; } else if (screenData.Length != imageSizeInBytes) { Debug.Fail("Preallocated buffer for GetScreenData incorrect size: " + imageSizeInBytes.ToString() + " expected, " + screenData.Length * bytesPerPixel + " received"); return(returnData); } MyBindableResource imageSource = Backbuffer; if (imageSource == null) { return(returnData); } if (imageSizeInBytes > int.MaxValue) { Debug.Fail("Image size too large to read!"); return(returnData); } MyBindableResource imageResource = imageSource; if (resolution.X != imageResource.GetSize().X || resolution.Y != imageResource.GetSize().Y) { imageResource = m_lastScreenDataResource; if (imageResource == null || (imageResource.GetSize().X != resolution.X || imageResource.GetSize().Y != resolution.Y)) { if (m_lastScreenDataResource != null && m_lastScreenDataResource != Backbuffer) { m_lastScreenDataResource.Release(); } m_lastScreenDataResource = null; imageResource = new MyRenderTarget(resolution.X, resolution.Y, MyRender11Constants.DX11_BACKBUFFER_FORMAT, 0, 0); } MyCopyToRT.Run(imageResource, imageSource, new MyViewport(resolution)); } m_lastScreenDataResource = imageResource; Stream dataStream = m_lastDataStream; if (m_lastDataStream == null || m_lastDataStream.Length != dataSizeInBytes) { if (m_lastDataStream != null) { m_lastDataStream.Dispose(); m_lastDataStream = null; } dataStream = new DataStream((int)dataSizeInBytes, true, true); } m_lastDataStream = dataStream; Resource.ToStream(MyRenderContext.Immediate.DeviceContext, imageResource.m_resource, ImageFileFormat.Bmp, dataStream); if (!(dataStream.CanRead && dataStream.CanSeek)) { Debug.Fail("Screen data stream does not support the necessary operations to get the data"); return(returnData); } fixed(byte *dataPointer = screenData) { GetBmpDataFromStream(dataStream, dataPointer, imageSizeInBytes); } returnData = screenData; if (m_lastDataStream != null) { m_lastDataStream.Seek(0, SeekOrigin.Begin); } return(returnData); }
// Returns the final image and copies it to renderTarget if non-null private static MyBindableResource DrawGameScene(MyBindableResource renderTarget) { ProfilerShort.Begin("DrawGameScene"); PrepareGameScene(); // todo: shouldn't be necessary if (true) { ProfilerShort.Begin("Clear"); MyRenderContext.Immediate.Clear(); MyRenderContext.Immediate.DeviceContext.ClearState(); ProfilerShort.End(); } Debug.Assert(m_commandLists.Count == 0, "Not all command lists executed last frame!"); DynamicGeometryRenderer.Render(m_commandLists, true); if (MyScene.SeparateGeometry) { StaticGeometryRenderer.Render(m_commandLists, false); } SendGlobalOutputMessages(); ExecuteCommandLists(m_commandLists); MyEnvironmentProbe.FinalizeEnvProbes(); // cleanup context atfer deferred lists if (MyRender11.DeferredContextsEnabled) { ProfilerShort.Begin("Clear2"); MyRenderContext.Immediate.Clear(); ProfilerShort.End(); } // todo: shouldn't be necessary if (true) { ProfilerShort.Begin("Clear3"); MyRenderContext.Immediate.Clear(); MyRenderContext.Immediate.DeviceContext.ClearState(); ProfilerShort.End(); } ProfilerShort.Begin("Render decals"); MyGpuProfiler.IC_BeginBlock("Render decals"); MyRender11.CopyGbufferToScratch(); MyScreenDecals.Draw(); MyGpuProfiler.IC_EndBlock(); ProfilerShort.BeginNextBlock("Render foliage"); MyGpuProfiler.IC_BeginBlock("Render foliage"); m_foliageRenderer.Render(); MyGpuProfiler.IC_EndBlock(); ProfilerShort.BeginNextBlock("MySceneMaterials.MoveToGPU"); MySceneMaterials.MoveToGPU(); ProfilerShort.BeginNextBlock("Postprocessing"); MyGpuProfiler.IC_BeginBlock("Postprocessing"); if (MultisamplingEnabled) { MyRender11.DeviceContext.ClearDepthStencilView(MyScreenDependants.m_resolvedDepth.m_DSV, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1, 0); MyGpuProfiler.IC_BeginBlock("MarkAAEdges"); MyAAEdgeMarking.Run(); MyGpuProfiler.IC_EndBlock(); MyDepthResolve.Run(MyScreenDependants.m_resolvedDepth, MyGBuffer.Main.DepthStencil.Depth); } if (MyScene.SeparateGeometry) { MyShadowCascadesPostProcess.Combine(MyShadowCascades.CombineShadowmapArray, DynamicShadows.ShadowCascades, StaticShadows.ShadowCascades); DynamicShadows.ShadowCascades.PostProcess(MyRender11.PostProcessedShadows, MyShadowCascades.CombineShadowmapArray); } else { DynamicShadows.ShadowCascades.PostProcess(MyRender11.PostProcessedShadows, DynamicShadows.ShadowCascades.CascadeShadowmapArray); } MyGpuProfiler.IC_BeginBlock("SSAO"); if (Postprocess.EnableSsao) { MySSAO.Run(MyScreenDependants.m_ambientOcclusion, MyGBuffer.Main, MyRender11.MultisamplingEnabled ? MyScreenDependants.m_resolvedDepth.Depth : MyGBuffer.Main.DepthStencil.Depth); if (MySSAO.UseBlur) { MyBlur.Run(MyScreenDependants.m_ambientOcclusion, MyScreenDependants.m_ambientOcclusionHelper, MyScreenDependants.m_ambientOcclusion); } } else { MyRender11.DeviceContext.ClearRenderTargetView(MyScreenDependants.m_ambientOcclusion.m_RTV, Color4.White); } MyGpuProfiler.IC_EndBlock(); MyGpuProfiler.IC_BeginBlock("Lights"); MyLightRendering.Render(); MyGpuProfiler.IC_EndBlock(); ProfilerShort.BeginNextBlock("Billboards"); MyGpuProfiler.IC_BeginBlock("Billboards"); if (MyRender11.MultisamplingEnabled) { MyBillboardRenderer.Render(MyGBuffer.Main.Get(MyGbufferSlot.LBuffer), MyScreenDependants.m_resolvedDepth, MyScreenDependants.m_resolvedDepth.Depth); } else { MyBillboardRenderer.Render(MyGBuffer.Main.Get(MyGbufferSlot.LBuffer), MyGBuffer.Main.DepthStencil, MyGBuffer.Main.DepthStencil.Depth); } MyGpuProfiler.IC_EndBlock(); ProfilerShort.BeginNextBlock("Atmosphere"); MyGpuProfiler.IC_BeginBlock("Atmosphere"); MyAtmosphereRenderer.Render(); MyGpuProfiler.IC_EndBlock(); ProfilerShort.BeginNextBlock("Clouds"); MyGpuProfiler.IC_BeginBlock("Clouds"); MyCloudRenderer.Render(); MyGpuProfiler.IC_EndBlock(); ProfilerShort.End(); MyGpuProfiler.IC_BeginBlock("Luminance reduction"); MyBindableResource avgLum = null; if (MyRender11.MultisamplingEnabled) { MyRenderContext.Immediate.DeviceContext.ResolveSubresource(MyGBuffer.Main.Get(MyGbufferSlot.LBuffer).m_resource, 0, MyGBuffer.Main.Get(MyGbufferSlot.LBufferResolved).m_resource, 0, SharpDX.DXGI.Format.R11G11B10_Float); } if (m_resetEyeAdaptation) { MyRenderContext.Immediate.DeviceContext.ClearUnorderedAccessView(m_prevLum.m_UAV, Int4.Zero); m_resetEyeAdaptation = false; } avgLum = MyLuminanceAverage.Run(m_reduce0, m_reduce1, MyGBuffer.Main.Get(MyGbufferSlot.LBuffer), m_prevLum); MyGpuProfiler.IC_EndBlock(); if (MyRender11.Settings.DisplayHdrDebug) { var src = MyGBuffer.Main.Get(MyGbufferSlot.LBuffer) as MyRenderTarget; MyHdrDebugTools.CreateHistogram(src.m_SRV, src.m_resolution, src.m_samples.X); } MyGpuProfiler.IC_BeginBlock("Bloom"); var bloom = MyBloom.Run(MyGBuffer.Main.Get(MyGbufferSlot.LBuffer), avgLum); MyGpuProfiler.IC_EndBlock(); MyBindableResource tonemapped; if (MyRender11.FxaaEnabled) { tonemapped = m_rgba8_linear; } else { tonemapped = m_uav3; } MyGpuProfiler.IC_BeginBlock("Tone mapping"); MyToneMapping.Run(tonemapped, MyGBuffer.Main.Get(MyGbufferSlot.LBuffer), avgLum, bloom, Postprocess.EnableTonemapping); MyGpuProfiler.IC_EndBlock(); MyBindableResource renderedImage; if (MyRender11.FxaaEnabled) { MyGpuProfiler.IC_BeginBlock("FXAA"); MyFXAA.Run(m_rgba8_0.GetView(new MyViewKey { Fmt = SharpDX.DXGI.Format.R8G8B8A8_UNorm, View = MyViewEnum.RtvView }), tonemapped); MyGpuProfiler.IC_EndBlock(); renderedImage = m_rgba8_0.GetView(new MyViewKey { Fmt = SharpDX.DXGI.Format.R8G8B8A8_UNorm_SRgb, View = MyViewEnum.SrvView }); } else { //renderedImage = (tonemapped as MyCustomTexture).GetView(new MyViewKey { Fmt = SharpDX.DXGI.Format.R8G8B8A8_UNorm_SRgb, View = MyViewEnum.SrvView }); renderedImage = tonemapped; } ProfilerShort.Begin("Outline"); if (MyOutline.AnyOutline()) { MyOutline.Run(); MyGpuProfiler.IC_BeginBlock("Outline Blending"); ProfilerShort.Begin("Outline Blending"); if (MyRender11.FxaaEnabled) { MyBlendTargets.RunWithStencil( m_rgba8_0.GetView(new MyViewKey { Fmt = SharpDX.DXGI.Format.R8G8B8A8_UNorm_SRgb, View = MyViewEnum.RtvView }), MyRender11.m_rgba8_1, MyRender11.BlendAdditive, MyDepthStencilState.TestOutlineMeshStencil, 0x40); MyBlendTargets.RunWithStencil( m_rgba8_0.GetView(new MyViewKey { Fmt = SharpDX.DXGI.Format.R8G8B8A8_UNorm_SRgb, View = MyViewEnum.RtvView }), MyRender11.m_rgba8_1, MyRender11.BlendTransparent, MyDepthStencilState.TestHighlightMeshStencil, 0x40); } else { if (MyRender11.MultisamplingEnabled) { MyBlendTargets.RunWithPixelStencilTest(tonemapped, MyRender11.m_rgba8_ms, MyRender11.BlendAdditive); MyBlendTargets.RunWithPixelStencilTest(tonemapped, MyRender11.m_rgba8_ms, MyRender11.BlendTransparent, true); } else { MyBlendTargets.RunWithStencil(tonemapped, MyRender11.m_rgba8_1, MyRender11.BlendAdditive, MyDepthStencilState.TestOutlineMeshStencil, 0x40); MyBlendTargets.RunWithStencil(tonemapped, MyRender11.m_rgba8_1, MyRender11.BlendTransparent, MyDepthStencilState.TestHighlightMeshStencil, 0x40); } } ProfilerShort.End(); MyGpuProfiler.IC_EndBlock(); } ProfilerShort.End(); if (renderTarget != null) { MyCopyToRT.Run(renderTarget, renderedImage); } if (MyRender11.Settings.DisplayHdrDebug) { MyHdrDebugTools.DisplayHistogram((renderTarget as IRenderTargetBindable).RTV, (avgLum as IShaderResourceBindable).SRV); } MyGpuProfiler.IC_EndBlock(); ProfilerShort.End(); return(renderedImage); }
// Returns the final image and copies it to renderTarget if non-null private static IRtvTexture DrawGameScene(IRtvBindable renderTarget, out IBorrowedRtvTexture debugAmbientOcclusion) { MyGpuProfiler.IC_BeginBlockAlways("ClearAndGeometryRender"); PrepareGameScene(); // todo: shouldn't be necessary if (true) { ProfilerShort.Begin("Clear"); MyRender11.RC.ClearState(); ProfilerShort.End(); } if (MyStereoRender.Enable && MyStereoRender.EnableUsingStencilMask) { ProfilerShort.Begin("MyStereoStencilMask.Draw"); MyGpuProfiler.IC_BeginBlock("MyStereoStencilMask.Draw"); MyStereoStencilMask.Draw(); MyGpuProfiler.IC_EndBlock(); ProfilerShort.End(); } ProfilerShort.Begin("MyLights.Update"); MyLights.Update(); ProfilerShort.End(); ProfilerShort.Begin("DynamicGeometryRenderer"); MyCullQuery cullQuery = m_dynamicGeometryRenderer.PrepareCullQuery(true); // it is used to share rendering settings between the old and the new pipeline ProfilerShort.End(); MyGpuProfiler.IC_BeginBlock("NewGeometryRenderer"); ProfilerShort.Begin("NewGeometryRenderer"); IGeometrySrvStrategy geometrySrvStrategy = MyManagers.GeometrySrvResolver.GetGeometrySrvStrategy(); if (MyDebugGeometryStage2.EnableNewGeometryPipeline) { MyManagers.GeometryRenderer.Render(cullQuery, geometrySrvStrategy); } ProfilerShort.End(); MyGpuProfiler.IC_EndBlock(); MyGpuProfiler.IC_BeginBlock("MyGeometryRenderer.Render"); Debug.Assert(m_commandLists.Count == 0, "Not all command lists executed last frame!"); ProfilerShort.Begin("DynamicGeometryRenderer"); m_dynamicGeometryRenderer.Render(m_commandLists); ProfilerShort.End(); // End function block if (MyScene.SeparateGeometry) { ProfilerShort.Begin("StaticGeometryRenderer"); m_staticGeometryRenderer.Render(m_commandLists); // , false); ProfilerShort.End(); // End function block } SendGlobalOutputMessages(); ExecuteCommandLists(m_commandLists); MyGpuProfiler.IC_EndBlock(); #if !UNSHARPER_TMP MyManagers.EnvironmentProbe.FinalizeEnvProbes(); #endif // cleanup context atfer deferred lists if (true) { ProfilerShort.Begin("Clear3"); MyRender11.RC.ClearState(); ProfilerShort.End(); } MyGpuProfiler.IC_EndBlockAlways(); IBorrowedRtvTexture gbuffer1Copy = MyGBuffer.Main.GetGbuffer1CopyRtv(); ProfilerShort.Begin("Render decals - Opaque"); MyGpuProfiler.IC_BeginBlock("Render decals - Opaque"); MyScreenDecals.Draw(gbuffer1Copy, false); MyGpuProfiler.IC_EndBlock(); IBorrowedDepthStencilTexture depthStencilCopy = null; // Highlights need the depth state before foliage if (MyHighlight.HasHighlights) { depthStencilCopy = MyGBuffer.Main.GetDepthStencilCopyRtv(); } ProfilerShort.BeginNextBlock("Render foliage"); MyGpuProfiler.IC_BeginBlockAlways("RenderFoliage"); m_foliageRenderer.Render(); MyGpuProfiler.IC_EndBlockAlways(); MyGpuProfiler.IC_BeginBlock("GBuffer Resolve"); ProfilerShort.BeginNextBlock("MySceneMaterials.MoveToGPU"); MySceneMaterials.MoveToGPU(); MyRender11.RC.ResetTargets(); IBorrowedRtvTexture ambientOcclusionRtv = MyManagers.RwTexturesPool.BorrowRtv("MyScreenDependants.AmbientOcclusion", ResolutionI.X, ResolutionI.Y, SharpDX.DXGI.Format.R8_UNorm); debugAmbientOcclusion = ambientOcclusionRtv; // Pass the texture to the outside int nPasses = MyStereoRender.Enable ? 2 : 1; for (int i = 0; i < nPasses; i++) { if (MyStereoRender.Enable) { MyStereoRender.RenderRegion = i == 0 ? MyStereoRegion.LEFT : MyStereoRegion.RIGHT; } MyGBuffer.Main.ResolveMultisample(); ProfilerShort.BeginNextBlock("Shadows"); MyGpuProfiler.IC_BeginBlockAlways("Shadows"); IBorrowedUavTexture postProcessedShadows; if (MyScene.SeparateGeometry) { MyShadowCascadesPostProcess.Combine(MyShadowCascades.CombineShadowmapArray, DynamicShadows.ShadowCascades, StaticShadows.ShadowCascades); postProcessedShadows = DynamicShadows.ShadowCascades.PostProcess(MyShadowCascades.CombineShadowmapArray); //MyShadowCascadesPostProcess.Combine(MyShadowCascades.CombineShadowmapArray, // DynamicShadows.ShadowCascades, StaticShadows.ShadowCascades); //postProcessedShadows = // DynamicShadows.ShadowCascades.PostProcess(MyShadowCascades.CombineShadowmapArray); } else { postProcessedShadows = DynamicShadows.ShadowCascades.PostProcess(DynamicShadows.ShadowCascades.CascadeShadowmapArray); //postProcessedShadows = MyManagers.Shadow.Evaluate(); } MyGpuProfiler.IC_EndBlockAlways(); if (MySSAO.Params.Enabled && Settings.User.AmbientOcclusionEnabled && m_debugOverrides.Postprocessing && m_debugOverrides.SSAO) { ProfilerShort.BeginNextBlock("SSAO"); MyGpuProfiler.IC_BeginBlockAlways("SSAO"); MySSAO.Run(ambientOcclusionRtv, MyGBuffer.Main); if (MySSAO.Params.UseBlur) { IBorrowedRtvTexture ambientOcclusionHelper = MyManagers.RwTexturesPool.BorrowRtv("MyScreenDependants.AmbientOcclusionHelper", ResolutionI.X, ResolutionI.Y, SharpDX.DXGI.Format.R8_UNorm); MyBlur.Run(ambientOcclusionRtv, ambientOcclusionHelper, ambientOcclusionRtv, clearColor: Color4.White); ambientOcclusionHelper.Release(); } MyGpuProfiler.IC_EndBlockAlways(); } else if (MyHBAO.Params.Enabled && Settings.User.AmbientOcclusionEnabled && m_debugOverrides.Postprocessing && m_debugOverrides.SSAO) { ProfilerShort.BeginNextBlock("HBAO"); MyGpuProfiler.IC_BeginBlock("HBAO"); MyHBAO.Run(ambientOcclusionRtv, MyGBuffer.Main); MyGpuProfiler.IC_EndBlock(); } else { MyRender11.RC.ClearRtv(ambientOcclusionRtv, Color4.White); } ProfilerShort.BeginNextBlock("Lights"); MyGpuProfiler.IC_BeginBlockAlways("Lights"); if (m_debugOverrides.Lighting) { MyLightsRendering.Render(postProcessedShadows, ambientOcclusionRtv); } MyGpuProfiler.IC_EndBlockAlways(); postProcessedShadows.Release(); if (MyRender11.DebugOverrides.Flares) { MyLightsRendering.DrawFlares(); } } MyStereoRender.RenderRegion = MyStereoRegion.FULLSCREEN; MyGpuProfiler.IC_EndBlock(); ProfilerShort.BeginNextBlock("Occlusion Queries"); MyGpuProfiler.IC_BeginBlock("Occlusion Queries"); MyOcclusionQueryRenderer.Render(RC, MyGBuffer.Main.ResolvedDepthStencil, MyGBuffer.Main.LBuffer); MyGpuProfiler.IC_EndBlock(); // Rendering for VR is solved inside of Transparent rendering ProfilerShort.BeginNextBlock("Transparent Pass"); MyGpuProfiler.IC_BeginBlockAlways("TransparentPass"); if (m_debugOverrides.Transparent) { MyTransparentRendering.Render(gbuffer1Copy); } MyGpuProfiler.IC_EndBlockAlways(); gbuffer1Copy.Release(); ProfilerShort.BeginNextBlock("PostProcess"); MyGpuProfiler.IC_BeginBlockAlways("PostProcess"); MyGpuProfiler.IC_BeginBlock("Luminance reduction"); IBorrowedUavTexture avgLum = null; if (MyRender11.Postprocess.EnableEyeAdaptation) { if (m_resetEyeAdaptation) { MyLuminanceAverage.Reset(); m_resetEyeAdaptation = false; } avgLum = MyLuminanceAverage.Run(MyGBuffer.Main.LBuffer); } else { avgLum = MyLuminanceAverage.Skip(); } MyGpuProfiler.IC_EndBlock(); IBorrowedUavTexture histogram = null; if (MyRender11.Settings.DisplayHistogram) { histogram = MyHdrDebugTools.CreateHistogram(MyGBuffer.Main.LBuffer, MyGBuffer.Main.SamplesCount); } if (MyRender11.Settings.DisplayHdrIntensity) { MyHdrDebugTools.DisplayHdrIntensity(MyGBuffer.Main.LBuffer); } MyGpuProfiler.IC_BeginBlock("Bloom"); IBorrowedUavTexture bloom; if (m_debugOverrides.Postprocessing && m_debugOverrides.Bloom) { bloom = MyBloom.Run(MyGBuffer.Main.LBuffer, MyGBuffer.Main.GBuffer2, MyGBuffer.Main.ResolvedDepthStencil.SrvDepth); } else { bloom = MyManagers.RwTexturesPool.BorrowUav("bloom_EightScreenUavHDR", MyRender11.ResolutionI.X / 8, MyRender11.ResolutionI.Y / 8, MyGBuffer.LBufferFormat); MyRender11.RC.ClearRtv(bloom, Color4.Black); } MyGpuProfiler.IC_EndBlock(); MyGpuProfiler.IC_BeginBlock("Tone mapping"); IBorrowedUavTexture tonemapped = MyToneMapping.Run(MyGBuffer.Main.LBuffer, avgLum, bloom, Postprocess.EnableTonemapping && m_debugOverrides.Postprocessing && m_debugOverrides.Tonemapping); bloom.Release(); MyGpuProfiler.IC_EndBlock(); IRtvTexture renderedImage; IBorrowedCustomTexture fxaaTarget = null; bool fxaa = MyRender11.FxaaEnabled; if (fxaa) { fxaaTarget = MyManagers.RwTexturesPool.BorrowCustom("MyRender11.FXAA.Rgb8"); MyGpuProfiler.IC_BeginBlock("FXAA"); MyFXAA.Run(fxaaTarget.Linear, tonemapped); MyGpuProfiler.IC_EndBlock(); renderedImage = fxaaTarget.SRgb; } else { renderedImage = tonemapped; } ProfilerShort.Begin("MyHighlight.Run"); MyHighlight.Run(renderedImage, fxaaTarget, depthStencilCopy); ProfilerShort.End(); if (depthStencilCopy != null) { depthStencilCopy.Release(); } if (renderTarget != null) { MyCopyToRT.Run(renderTarget, renderedImage); } if (MyRender11.Settings.DisplayHistogram) { if (renderTarget != null && avgLum != null) { MyHdrDebugTools.DisplayHistogram(renderTarget, avgLum, histogram); } } MyGpuProfiler.IC_EndBlockAlways(); ProfilerShort.End(); if (fxaaTarget != null) { fxaaTarget.Release(); } if (histogram != null) { histogram.Release(); } avgLum.Release(); tonemapped.Release(); // HOTFIX: MyDebugTextureDisplay uses borrowed textures. If we place MyDebugTextureDisplay to the different location, we will have problem with borrowed textures (comment by Michal) ProfilerShort.Begin("MyDebugTextureDisplay.Draw"); MyGpuProfiler.IC_BeginBlock("MyDebugTextureDisplay.Draw"); MyDebugTextureDisplay.Draw(MyRender11.Backbuffer); MyGpuProfiler.IC_EndBlock(); ProfilerShort.End(); return(renderedImage); }
internal static void Present() { if (m_swapchain != null) { GetRenderProfiler().StartProfilingBlock("Screenshot"); if (m_screenshot.HasValue) { if (m_screenshot.Value.SizeMult == VRageMath.Vector2.One) { MyCopyToRT.ClearAlpha(Backbuffer); SaveScreenshotFromResource(Backbuffer.Resource); } else { TakeCustomSizedScreenshot(m_screenshot.Value.SizeMult); } } GetRenderProfiler().EndProfilingBlock(); try { MyManagers.OnFrameEnd(); MyGpuProfiler.IC_BeginBlock("Waiting for present"); GetRenderProfiler().StartProfilingBlock("Waiting for present"); m_swapchain.Present(m_settings.VSync ? 1 : 0, 0); GetRenderProfiler().EndProfilingBlock(); MyGpuProfiler.IC_EndBlock(); MyStatsUpdater.Timestamps.Update(ref MyStatsUpdater.Timestamps.Present, ref MyStatsUpdater.Timestamps.PreviousPresent); if (VRage.OpenVRWrapper.MyOpenVR.Static != null) { MyGpuProfiler.IC_BeginBlock("OpenVR.FrameDone"); GetRenderProfiler().StartProfilingBlock("OpenVR.FrameDone"); /*var handle=MyOpenVR.GetOverlay("menu"); * MyOpenVR.SetOverlayTexture(handle, MyRender11.Backbuffer.m_resource.NativePointer); */ VRage.OpenVRWrapper.MyOpenVR.FrameDone(); GetRenderProfiler().EndProfilingBlock(); MyGpuProfiler.IC_EndBlock(); } m_consecutivePresentFails = 0; GetRenderProfiler().StartProfilingBlock("Stopwatch"); if (m_presentTimer == null) { m_presentTimer = new Stopwatch(); } else { m_presentTimer.Stop(); if (m_presentTimes.Count >= PresentTimesStored) { m_presentTimes.Dequeue(); } m_presentTimes.Enqueue(m_presentTimer.ElapsedMilliseconds); } m_presentTimer.Restart(); GetRenderProfiler().EndProfilingBlock(); } catch (SharpDXException e) { Log.WriteLine("Device removed - resetting device; reason: " + e.Message); HandleDeviceReset(); Log.WriteLine("Device removed - resetting completed"); m_consecutivePresentFails++; if (m_consecutivePresentFails == 5) { Log.WriteLine("Present failed"); Log.IncreaseIndent(); if (e.Descriptor == SharpDX.DXGI.ResultCode.DeviceRemoved) { Log.WriteLine("Device removed: " + Device.DeviceRemovedReason); } var timings = ""; while (m_presentTimes.Count > 0) { timings += m_presentTimes.Dequeue(); if (m_presentTimes.Count > 0) { timings += ", "; } } Log.WriteLine("Last present timings = [ " + timings + " ]"); Log.DecreaseIndent(); } } GetRenderProfiler().StartProfilingBlock("GPU profiler"); MyGpuProfiler.EndFrame(); MyGpuProfiler.StartFrame(); m_profilingStarted = true; GetRenderProfiler().EndProfilingBlock(); // waiting for change to fullscreen - window migh overlap or some other dxgi excuse to fail :( GetRenderProfiler().StartProfilingBlock("TryChangeToFullscreen"); TryChangeToFullscreen(); GetRenderProfiler().EndProfilingBlock(); } }