summaryrefslogtreecommitdiff
path: root/src/video_core/renderer_opengl
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2021-01-05 04:09:39 -0300
committerGravatar ReinUsesLisp2021-02-13 02:16:19 -0300
commit75ccd9959ca7aa78b71fbb800ed2127d8613e9dc (patch)
tree3b9b5c0779cff69ef135bb3394ae70a0d3a9804d /src/video_core/renderer_opengl
parenttests/buffer_base: Add cached CPU writes tests (diff)
downloadyuzu-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.cpp48
-rw-r--r--src/video_core/renderer_opengl/renderer_opengl.h11
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
137RendererOpenGL::~RendererOpenGL() = default; 150RendererOpenGL::~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
292void 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
300void RendererOpenGL::ConfigureFramebufferTexture(TextureInfo& texture, 305void 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
500bool 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
519void 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
70private: 73private:
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