private static bool ProcessDrawSpritesQueue(string textureName)
        {
            List <MySpriteDrawRenderMessage> messages;

            if (!m_spriteTextureBatches.TryGetValue(textureName, out messages) || messages.Count == 0)
            {
                return(false);
            }

            GetRenderProfiler().StartProfilingBlock("ProcessDrawQueue");

            foreach (var message in messages)
            {
                ProfilerShort.Begin(message.MessageType.ToString());
                ProcessDrawMessage(message);
                ProfilerShort.End();
            }
            messages.Clear();

            if (textureName == DEFAULT_TEXTURE_TARGET && MyRenderProxy.DrawRenderStats >= MyRenderProxy.MyStatsState.Draw)
            {
                // Stats will be drawn one frame later
                ProfilerShort.Begin("MyRenderStatsDraw.Draw");
                MyGpuProfiler.IC_BeginBlock("MyRenderStatsDraw.Draw");

                if (!m_drawStatsSwitch)
                {
                    MyRenderStatsDraw.Draw(MyRenderStats.m_stats, 0.6f, VRageMath.Color.Yellow);
                }
                else
                {
                    MyStatsUpdater.UpdateStats();
                    MyStatsDisplay.Draw();
                }

                if (MyRenderProxy.DrawRenderStats == MyRenderProxy.MyStatsState.MoveNext)
                {
                    MyRenderProxy.DrawRenderStats = MyRenderProxy.MyStatsState.Draw;

                    if (!m_drawStatsSwitch)
                    {
                        m_drawStatsSwitch = !m_drawStatsSwitch;
                        // We finished cycling through the last page -- signal turning off of drawing stats on the next MoveNext
                        MyRenderProxy.DrawRenderStats = MyRenderProxy.MyStatsState.ShouldFinish;
                    }
                    else
                    {
                        m_drawStatsSwitch = MyStatsDisplay.MoveToNextPage(); // After the last page (returns false), switch to old stat display
                    }
                }

                MyGpuProfiler.IC_EndBlock();
                ProfilerShort.End();
            }

            GetRenderProfiler().EndProfilingBlock();
            return(true);
        }
Beispiel #2
0
        void LogStuff(SharpDXException e)
        {
            if (MyRenderProxy.Log == null)
            {
                return;
            }

            MyRenderProxy.Log.WriteLine("Reason: " + e.Message.Trim());

            if (e.Descriptor == SharpDX.DXGI.ResultCode.DeviceRemoved)
            {
                MyRenderProxy.Log.WriteLine("Reason: " + MyRender11.Device.DeviceRemovedReason);
            }

            MyRenderProxy.Log.WriteMemoryUsage("");
            MyRenderProxy.Log.WriteLine("Buffer type name: " + GetType().Name);
            MyRenderProxy.Log.WriteLine("Buffer debug name: " + Name);
            MyRenderProxy.Log.WriteLine("Buffer description:\n" + BufferDescriptionToString());


            MyRenderProxy.Log.WriteLine("Exception stack trace: " + e.StackTrace);


            StringBuilder sb = new StringBuilder();

            System.Threading.Thread.Sleep(1000);

            foreach (var column in MyRenderStats.m_stats.Values)
            {
                foreach (var stats in column)
                {
                    sb.Clear();
                    stats.WriteTo(sb);
                    MyRenderProxy.Log.WriteLine(sb.ToString());
                }
            }

            MyStatsUpdater.UpdateStats();
            MyStatsDisplay.WriteTo(sb);
            MyRenderProxy.Log.WriteLine(sb.ToString());
        }
Beispiel #3
0
        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();
            }
        }
Beispiel #4
0
        internal static void Draw(bool draw = true)
        {
            try
            {
                MyGpuProfiler.IC_BeginBlock("Draw");
                GetRenderProfiler().StartProfilingBlock("ProcessMessages");
                MyGpuProfiler.IC_BeginBlock("ProcessMessageQueue");
                TransferLocalMessages();
                ProcessMessageQueue();
                MyGpuProfiler.IC_EndBlock();
                GetRenderProfiler().EndProfilingBlock();

                if (draw)
                {
                    m_drawScene = false;
                    DispatchDrawQueue();

                    if (m_drawScene)
                    {
                        DrawScene();
                    }

                    if (!(MyRender11.Settings.OffscreenSpritesRendering && m_drawScene))
                    {
                        ProcessDrawQueue();
                        DrawSprites(MyRender11.Backbuffer, new MyViewport(MyRender11.ViewportResolution.X, MyRender11.ViewportResolution.Y));
                    }

                    MyFileTextureManager texManager = MyManagers.FileTextures;
                    texManager.LoadAllRequested();

                    if (m_texturesToRender.Count > 0)
                    {
                        VRage.Render11.PostprocessStage.MySaveExportedTextures.RenderColoredTextures(m_texturesToRender);
                    }
                }

                MyLinesRenderer.Clear();
                MySpritesRenderer.Clear();

                m_drawQueue.Clear();
                MyGpuProfiler.IC_EndBlock();
            }
            catch (SharpDXException e)
            {
                MyRender11.Log.IncreaseIndent();
                MyRender11.Log.WriteLine(" " + e);
                if (e.Descriptor == SharpDX.DXGI.ResultCode.DeviceRemoved)
                {
                    MyRender11.Log.WriteLine("Reason: " + Device.DeviceRemovedReason);
                }

                // Include the stats
                m_exceptionBuilder.Clear();
                MyStatsUpdater.UpdateStats();
                MyStatsDisplay.WriteTo(m_exceptionBuilder);
                MyRender11.Log.WriteLine(m_exceptionBuilder.ToString());
                MyRender11.Log.Flush();
                MyRender11.Log.DecreaseIndent();
                throw;
            }
        }