diff options
| author | 2021-01-05 04:09:39 -0300 | |
|---|---|---|
| committer | 2021-02-13 02:16:19 -0300 | |
| commit | 75ccd9959ca7aa78b71fbb800ed2127d8613e9dc (patch) | |
| tree | 3b9b5c0779cff69ef135bb3394ae70a0d3a9804d /src/video_core/renderer_opengl | |
| parent | tests/buffer_base: Add cached CPU writes tests (diff) | |
| download | yuzu-75ccd9959ca7aa78b71fbb800ed2127d8613e9dc.tar.gz yuzu-75ccd9959ca7aa78b71fbb800ed2127d8613e9dc.tar.xz yuzu-75ccd9959ca7aa78b71fbb800ed2127d8613e9dc.zip | |
gpu: Report renderer errors with exceptions
Instead of using a two step initialization to report errors, initialize
the GPU renderer and rasterizer on the constructor and report errors
through std::runtime_error.
Diffstat (limited to 'src/video_core/renderer_opengl')
| -rw-r--r-- | src/video_core/renderer_opengl/renderer_opengl.cpp | 48 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/renderer_opengl.h | 11 |
2 files changed, 23 insertions, 36 deletions
diff --git a/src/video_core/renderer_opengl/renderer_opengl.cpp b/src/video_core/renderer_opengl/renderer_opengl.cpp index 21159e498..7eb5ab17a 100644 --- a/src/video_core/renderer_opengl/renderer_opengl.cpp +++ b/src/video_core/renderer_opengl/renderer_opengl.cpp | |||
| @@ -132,7 +132,20 @@ RendererOpenGL::RendererOpenGL(Core::TelemetrySession& telemetry_session_, | |||
| 132 | Core::Memory::Memory& cpu_memory_, Tegra::GPU& gpu_, | 132 | Core::Memory::Memory& cpu_memory_, Tegra::GPU& gpu_, |
| 133 | std::unique_ptr<Core::Frontend::GraphicsContext> context_) | 133 | std::unique_ptr<Core::Frontend::GraphicsContext> context_) |
| 134 | : RendererBase{emu_window_, std::move(context_)}, telemetry_session{telemetry_session_}, | 134 | : RendererBase{emu_window_, std::move(context_)}, telemetry_session{telemetry_session_}, |
| 135 | emu_window{emu_window_}, cpu_memory{cpu_memory_}, gpu{gpu_}, program_manager{device} {} | 135 | emu_window{emu_window_}, cpu_memory{cpu_memory_}, gpu{gpu_}, program_manager{device}, |
| 136 | rasterizer{emu_window, gpu, cpu_memory, device, screen_info, program_manager, state_tracker} { | ||
| 137 | if (Settings::values.renderer_debug && GLAD_GL_KHR_debug) { | ||
| 138 | glEnable(GL_DEBUG_OUTPUT); | ||
| 139 | glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS); | ||
| 140 | glDebugMessageCallback(DebugHandler, nullptr); | ||
| 141 | } | ||
| 142 | AddTelemetryFields(); | ||
| 143 | |||
| 144 | if (!GLAD_GL_VERSION_4_6) { | ||
| 145 | throw std::runtime_error{"OpenGL 4.3 is not available"}; | ||
| 146 | } | ||
| 147 | InitOpenGLObjects(); | ||
| 148 | } | ||
| 136 | 149 | ||
| 137 | RendererOpenGL::~RendererOpenGL() = default; | 150 | RendererOpenGL::~RendererOpenGL() = default; |
| 138 | 151 | ||
| @@ -148,7 +161,7 @@ void RendererOpenGL::SwapBuffers(const Tegra::FramebufferConfig* framebuffer) { | |||
| 148 | 161 | ||
| 149 | ++m_current_frame; | 162 | ++m_current_frame; |
| 150 | 163 | ||
| 151 | rasterizer->TickFrame(); | 164 | rasterizer.TickFrame(); |
| 152 | 165 | ||
| 153 | context->SwapBuffers(); | 166 | context->SwapBuffers(); |
| 154 | render_window.OnFrameDisplayed(); | 167 | render_window.OnFrameDisplayed(); |
| @@ -179,7 +192,7 @@ void RendererOpenGL::LoadFBToScreenInfo(const Tegra::FramebufferConfig& framebuf | |||
| 179 | framebuffer_crop_rect = framebuffer.crop_rect; | 192 | framebuffer_crop_rect = framebuffer.crop_rect; |
| 180 | 193 | ||
| 181 | const VAddr framebuffer_addr{framebuffer.address + framebuffer.offset}; | 194 | const VAddr framebuffer_addr{framebuffer.address + framebuffer.offset}; |
| 182 | if (rasterizer->AccelerateDisplay(framebuffer, framebuffer_addr, framebuffer.stride)) { | 195 | if (rasterizer.AccelerateDisplay(framebuffer, framebuffer_addr, framebuffer.stride)) { |
| 183 | return; | 196 | return; |
| 184 | } | 197 | } |
| 185 | 198 | ||
| @@ -289,14 +302,6 @@ void RendererOpenGL::AddTelemetryFields() { | |||
| 289 | telemetry_session.AddField(user_system, "GPU_OpenGL_Version", std::string(gl_version)); | 302 | telemetry_session.AddField(user_system, "GPU_OpenGL_Version", std::string(gl_version)); |
| 290 | } | 303 | } |
| 291 | 304 | ||
| 292 | void RendererOpenGL::CreateRasterizer() { | ||
| 293 | if (rasterizer) { | ||
| 294 | return; | ||
| 295 | } | ||
| 296 | rasterizer = std::make_unique<RasterizerOpenGL>(emu_window, gpu, cpu_memory, device, | ||
| 297 | screen_info, program_manager, state_tracker); | ||
| 298 | } | ||
| 299 | |||
| 300 | void RendererOpenGL::ConfigureFramebufferTexture(TextureInfo& texture, | 305 | void RendererOpenGL::ConfigureFramebufferTexture(TextureInfo& texture, |
| 301 | const Tegra::FramebufferConfig& framebuffer) { | 306 | const Tegra::FramebufferConfig& framebuffer) { |
| 302 | texture.width = framebuffer.width; | 307 | texture.width = framebuffer.width; |
| @@ -497,25 +502,4 @@ void RendererOpenGL::RenderScreenshot() { | |||
| 497 | renderer_settings.screenshot_requested = false; | 502 | renderer_settings.screenshot_requested = false; |
| 498 | } | 503 | } |
| 499 | 504 | ||
| 500 | bool RendererOpenGL::Init() { | ||
| 501 | if (Settings::values.renderer_debug && GLAD_GL_KHR_debug) { | ||
| 502 | glEnable(GL_DEBUG_OUTPUT); | ||
| 503 | glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS); | ||
| 504 | glDebugMessageCallback(DebugHandler, nullptr); | ||
| 505 | } | ||
| 506 | |||
| 507 | AddTelemetryFields(); | ||
| 508 | |||
| 509 | if (!GLAD_GL_VERSION_4_6) { | ||
| 510 | return false; | ||
| 511 | } | ||
| 512 | |||
| 513 | InitOpenGLObjects(); | ||
| 514 | CreateRasterizer(); | ||
| 515 | |||
| 516 | return true; | ||
| 517 | } | ||
| 518 | |||
| 519 | void RendererOpenGL::ShutDown() {} | ||
| 520 | |||
| 521 | } // namespace OpenGL | 505 | } // namespace OpenGL |
diff --git a/src/video_core/renderer_opengl/renderer_opengl.h b/src/video_core/renderer_opengl/renderer_opengl.h index 44e109794..e043a0ccb 100644 --- a/src/video_core/renderer_opengl/renderer_opengl.h +++ b/src/video_core/renderer_opengl/renderer_opengl.h | |||
| @@ -10,6 +10,7 @@ | |||
| 10 | #include "common/math_util.h" | 10 | #include "common/math_util.h" |
| 11 | #include "video_core/renderer_base.h" | 11 | #include "video_core/renderer_base.h" |
| 12 | #include "video_core/renderer_opengl/gl_device.h" | 12 | #include "video_core/renderer_opengl/gl_device.h" |
| 13 | #include "video_core/renderer_opengl/gl_rasterizer.h" | ||
| 13 | #include "video_core/renderer_opengl/gl_resource_manager.h" | 14 | #include "video_core/renderer_opengl/gl_resource_manager.h" |
| 14 | #include "video_core/renderer_opengl/gl_shader_manager.h" | 15 | #include "video_core/renderer_opengl/gl_shader_manager.h" |
| 15 | #include "video_core/renderer_opengl/gl_state_tracker.h" | 16 | #include "video_core/renderer_opengl/gl_state_tracker.h" |
| @@ -63,18 +64,18 @@ public: | |||
| 63 | std::unique_ptr<Core::Frontend::GraphicsContext> context_); | 64 | std::unique_ptr<Core::Frontend::GraphicsContext> context_); |
| 64 | ~RendererOpenGL() override; | 65 | ~RendererOpenGL() override; |
| 65 | 66 | ||
| 66 | bool Init() override; | ||
| 67 | void ShutDown() override; | ||
| 68 | void SwapBuffers(const Tegra::FramebufferConfig* framebuffer) override; | 67 | void SwapBuffers(const Tegra::FramebufferConfig* framebuffer) override; |
| 69 | 68 | ||
| 69 | VideoCore::RasterizerInterface* ReadRasterizer() override { | ||
| 70 | return &rasterizer; | ||
| 71 | } | ||
| 72 | |||
| 70 | private: | 73 | private: |
| 71 | /// Initializes the OpenGL state and creates persistent objects. | 74 | /// Initializes the OpenGL state and creates persistent objects. |
| 72 | void InitOpenGLObjects(); | 75 | void InitOpenGLObjects(); |
| 73 | 76 | ||
| 74 | void AddTelemetryFields(); | 77 | void AddTelemetryFields(); |
| 75 | 78 | ||
| 76 | void CreateRasterizer(); | ||
| 77 | |||
| 78 | void ConfigureFramebufferTexture(TextureInfo& texture, | 79 | void ConfigureFramebufferTexture(TextureInfo& texture, |
| 79 | const Tegra::FramebufferConfig& framebuffer); | 80 | const Tegra::FramebufferConfig& framebuffer); |
| 80 | 81 | ||
| @@ -118,6 +119,8 @@ private: | |||
| 118 | /// Global dummy shader pipeline | 119 | /// Global dummy shader pipeline |
| 119 | ProgramManager program_manager; | 120 | ProgramManager program_manager; |
| 120 | 121 | ||
| 122 | RasterizerOpenGL rasterizer; | ||
| 123 | |||
| 121 | /// OpenGL framebuffer data | 124 | /// OpenGL framebuffer data |
| 122 | std::vector<u8> gl_framebuffer_data; | 125 | std::vector<u8> gl_framebuffer_data; |
| 123 | 126 | ||