private static void OnDeviceReset() { MyManagers.OnDeviceReset(); MyShaders.OnDeviceReset(); MyMaterialShaders.OnDeviceReset(); MyTransparentRendering.OnDeviceReset(); ResetShadows(MyShadowCascades.Settings.NewData.CascadesCount, Settings.User.ShadowQuality.ShadowCascadeResolution()); MyBillboardRenderer.OnDeviceReset(); MyScreenDecals.OnDeviceReset(); MyMeshMaterials1.OnDeviceReset(); MyVoxelMaterials1.OnDeviceReset(); MyRenderableComponent.MarkAllDirty(); foreach (var f in MyComponentFactory <MyFoliageComponent> .GetAll()) { f.Dispose(); } foreach (var c in MyComponentFactory <MyGroupRootComponent> .GetAll()) { c.OnDeviceReset(); } MyBigMeshTable.Table.OnDeviceReset(); MySceneMaterials.OnDeviceReset(); MyMeshes.OnDeviceReset(); MyInstancing.OnDeviceReset(); MyScreenDecals.OnDeviceReset(); }
private static void OnDeviceEnd() { // Reversed order of calling End -- Managers last MyScreenDecals.OnDeviceEnd(); MyShaders.OnDeviceEnd(); MyMaterialShaders.OnDeviceEnd(); MyVoxelMaterials1.OnDeviceEnd(); MyTransparentRendering.OnDeviceEnd(); MyManagers.OnDeviceEnd(); }
internal static void OnDeviceEnd() { MyManagers.OnDeviceEnd(); MyScreenDecals.OnDeviceEnd(); MyShaders.OnDeviceEnd(); MyMaterialShaders.OnDeviceEnd(); MyVoxelMaterials1.OnDeviceEnd(); //MyRwTextures.OnDeviceEnd(); MyHwBuffers.OnDeviceEnd(); MyTransparentRendering.OnDeviceEnd(); }
internal static void UnloadData() { MyManagers.OnUnloadData(); MyActorFactory.RemoveAll(); // many-to-one relation, can live withput owners, deallocated separately // MyComponentFactory<MyInstancingComponent>.RemoveAll(); //MyVoxelMesh.RemoveAll(); //MyDynamicMesh.RemoveAll(); MyRender11.Log.WriteLine("Unloading session data"); // Remove leftover persistent debug draw messages m_debugDrawMessages.Clear(); MyScene.DynamicRenderablesDBVH.Clear(); if (MyScene.SeparateGeometry) { MyScene.StaticRenderablesDBVH.Clear(); } MyScene.GroupsDBVH.Clear(); MyScene.FoliageDBVH.Clear(); MyClipmapFactory.RemoveAll(); MyClipmap.UnloadCache(); MyInstancing.OnSessionEnd(); MyFoliageComponents.OnSessionEnd(); MyMeshes.OnSessionEnd(); MyLights.OnSessionEnd(); MyMaterials1.OnSessionEnd(); MyVoxelMaterials1.OnSessionEnd(); MyMeshMaterials1.OnSessionEnd(); MyScreenDecals.OnSessionEnd(); MyBigMeshTable.Table.OnSessionEnd(); MyPrimitivesRenderer.Unload(); MyTransparentRendering.OnSessionEnd(); //MyAssetsLoader.ClearMeshes(); }
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) { 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(); } }
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(); } }