diff options
| author | 2018-08-03 12:55:58 -0400 | |
|---|---|---|
| committer | 2018-08-04 02:36:57 -0400 | |
| commit | 6030c5ce412e44ddcfe0a31c6747a017166bf33d (patch) | |
| tree | 2b79fa019f07e601b5170e92e93b69788ffde949 /src/video_core | |
| parent | Merge pull request #911 from lioncash/prototype (diff) | |
| download | yuzu-6030c5ce412e44ddcfe0a31c6747a017166bf33d.tar.gz yuzu-6030c5ce412e44ddcfe0a31c6747a017166bf33d.tar.xz yuzu-6030c5ce412e44ddcfe0a31c6747a017166bf33d.zip | |
video_core: Eliminate the g_renderer global variable
We move the initialization of the renderer to the core class, while
keeping the creation of it and any other specifics in video_core. This
way we can ensure that the renderer is initialized and doesn't give
unfettered access to the renderer. This also makes dependencies on types
more explicit.
For example, the GPU class doesn't need to depend on the
existence of a renderer, it only needs to care about whether or not it
has a rasterizer, but since it was accessing the global variable, it was
also making the renderer a part of its dependency chain. By adjusting
the interface, we can get rid of this dependency.
Diffstat (limited to 'src/video_core')
| -rw-r--r-- | src/video_core/engines/maxwell_3d.cpp | 10 | ||||
| -rw-r--r-- | src/video_core/engines/maxwell_3d.h | 8 | ||||
| -rw-r--r-- | src/video_core/gpu.cpp | 5 | ||||
| -rw-r--r-- | src/video_core/gpu.h | 6 | ||||
| -rw-r--r-- | src/video_core/renderer_base.cpp | 4 | ||||
| -rw-r--r-- | src/video_core/renderer_base.h | 8 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/renderer_opengl.cpp | 2 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/renderer_opengl.h | 2 | ||||
| -rw-r--r-- | src/video_core/video_core.cpp | 25 | ||||
| -rw-r--r-- | src/video_core/video_core.h | 20 |
10 files changed, 43 insertions, 47 deletions
diff --git a/src/video_core/engines/maxwell_3d.cpp b/src/video_core/engines/maxwell_3d.cpp index 0e205ed72..a235b543e 100644 --- a/src/video_core/engines/maxwell_3d.cpp +++ b/src/video_core/engines/maxwell_3d.cpp | |||
| @@ -19,8 +19,8 @@ namespace Engines { | |||
| 19 | /// First register id that is actually a Macro call. | 19 | /// First register id that is actually a Macro call. |
| 20 | constexpr u32 MacroRegistersStart = 0xE00; | 20 | constexpr u32 MacroRegistersStart = 0xE00; |
| 21 | 21 | ||
| 22 | Maxwell3D::Maxwell3D(MemoryManager& memory_manager) | 22 | Maxwell3D::Maxwell3D(VideoCore::RasterizerInterface& rasterizer, MemoryManager& memory_manager) |
| 23 | : memory_manager(memory_manager), macro_interpreter(*this) {} | 23 | : memory_manager(memory_manager), rasterizer{rasterizer}, macro_interpreter(*this) {} |
| 24 | 24 | ||
| 25 | void Maxwell3D::CallMacroMethod(u32 method, std::vector<u32> parameters) { | 25 | void Maxwell3D::CallMacroMethod(u32 method, std::vector<u32> parameters) { |
| 26 | auto macro_code = uploaded_macros.find(method); | 26 | auto macro_code = uploaded_macros.find(method); |
| @@ -130,7 +130,7 @@ void Maxwell3D::WriteReg(u32 method, u32 value, u32 remaining_params) { | |||
| 130 | break; | 130 | break; |
| 131 | } | 131 | } |
| 132 | 132 | ||
| 133 | VideoCore::g_renderer->Rasterizer()->NotifyMaxwellRegisterChanged(method); | 133 | rasterizer.NotifyMaxwellRegisterChanged(method); |
| 134 | 134 | ||
| 135 | if (debug_context) { | 135 | if (debug_context) { |
| 136 | debug_context->OnEvent(Tegra::DebugContext::Event::MaxwellCommandProcessed, nullptr); | 136 | debug_context->OnEvent(Tegra::DebugContext::Event::MaxwellCommandProcessed, nullptr); |
| @@ -218,7 +218,7 @@ void Maxwell3D::DrawArrays() { | |||
| 218 | } | 218 | } |
| 219 | 219 | ||
| 220 | const bool is_indexed{regs.index_array.count && !regs.vertex_buffer.count}; | 220 | const bool is_indexed{regs.index_array.count && !regs.vertex_buffer.count}; |
| 221 | VideoCore::g_renderer->Rasterizer()->AccelerateDrawBatch(is_indexed); | 221 | rasterizer.AccelerateDrawBatch(is_indexed); |
| 222 | 222 | ||
| 223 | // TODO(bunnei): Below, we reset vertex count so that we can use these registers to determine if | 223 | // TODO(bunnei): Below, we reset vertex count so that we can use these registers to determine if |
| 224 | // the game is trying to draw indexed or direct mode. This needs to be verified on HW still - | 224 | // the game is trying to draw indexed or direct mode. This needs to be verified on HW still - |
| @@ -393,7 +393,7 @@ void Maxwell3D::ProcessClearBuffers() { | |||
| 393 | regs.clear_buffers.R == regs.clear_buffers.B && | 393 | regs.clear_buffers.R == regs.clear_buffers.B && |
| 394 | regs.clear_buffers.R == regs.clear_buffers.A); | 394 | regs.clear_buffers.R == regs.clear_buffers.A); |
| 395 | 395 | ||
| 396 | VideoCore::g_renderer->Rasterizer()->Clear(); | 396 | rasterizer.Clear(); |
| 397 | } | 397 | } |
| 398 | 398 | ||
| 399 | } // namespace Engines | 399 | } // namespace Engines |
diff --git a/src/video_core/engines/maxwell_3d.h b/src/video_core/engines/maxwell_3d.h index 3c32f1067..4d0ff96a5 100644 --- a/src/video_core/engines/maxwell_3d.h +++ b/src/video_core/engines/maxwell_3d.h | |||
| @@ -17,6 +17,10 @@ | |||
| 17 | #include "video_core/memory_manager.h" | 17 | #include "video_core/memory_manager.h" |
| 18 | #include "video_core/textures/texture.h" | 18 | #include "video_core/textures/texture.h" |
| 19 | 19 | ||
| 20 | namespace VideoCore { | ||
| 21 | class RasterizerInterface; | ||
| 22 | } | ||
| 23 | |||
| 20 | namespace Tegra::Engines { | 24 | namespace Tegra::Engines { |
| 21 | 25 | ||
| 22 | #define MAXWELL3D_REG_INDEX(field_name) \ | 26 | #define MAXWELL3D_REG_INDEX(field_name) \ |
| @@ -24,7 +28,7 @@ namespace Tegra::Engines { | |||
| 24 | 28 | ||
| 25 | class Maxwell3D final { | 29 | class Maxwell3D final { |
| 26 | public: | 30 | public: |
| 27 | explicit Maxwell3D(MemoryManager& memory_manager); | 31 | explicit Maxwell3D(VideoCore::RasterizerInterface& rasterizer, MemoryManager& memory_manager); |
| 28 | ~Maxwell3D() = default; | 32 | ~Maxwell3D() = default; |
| 29 | 33 | ||
| 30 | /// Register structure of the Maxwell3D engine. | 34 | /// Register structure of the Maxwell3D engine. |
| @@ -818,6 +822,8 @@ public: | |||
| 818 | Texture::FullTextureInfo GetStageTexture(Regs::ShaderStage stage, size_t offset) const; | 822 | Texture::FullTextureInfo GetStageTexture(Regs::ShaderStage stage, size_t offset) const; |
| 819 | 823 | ||
| 820 | private: | 824 | private: |
| 825 | VideoCore::RasterizerInterface& rasterizer; | ||
| 826 | |||
| 821 | std::unordered_map<u32, std::vector<u32>> uploaded_macros; | 827 | std::unordered_map<u32, std::vector<u32>> uploaded_macros; |
| 822 | 828 | ||
| 823 | /// Macro method that is currently being executed / being fed parameters. | 829 | /// Macro method that is currently being executed / being fed parameters. |
diff --git a/src/video_core/gpu.cpp b/src/video_core/gpu.cpp index 141e20444..b2a83ce0b 100644 --- a/src/video_core/gpu.cpp +++ b/src/video_core/gpu.cpp | |||
| @@ -7,12 +7,13 @@ | |||
| 7 | #include "video_core/engines/maxwell_compute.h" | 7 | #include "video_core/engines/maxwell_compute.h" |
| 8 | #include "video_core/engines/maxwell_dma.h" | 8 | #include "video_core/engines/maxwell_dma.h" |
| 9 | #include "video_core/gpu.h" | 9 | #include "video_core/gpu.h" |
| 10 | #include "video_core/rasterizer_interface.h" | ||
| 10 | 11 | ||
| 11 | namespace Tegra { | 12 | namespace Tegra { |
| 12 | 13 | ||
| 13 | GPU::GPU() { | 14 | GPU::GPU(VideoCore::RasterizerInterface& rasterizer) { |
| 14 | memory_manager = std::make_unique<MemoryManager>(); | 15 | memory_manager = std::make_unique<MemoryManager>(); |
| 15 | maxwell_3d = std::make_unique<Engines::Maxwell3D>(*memory_manager); | 16 | maxwell_3d = std::make_unique<Engines::Maxwell3D>(rasterizer, *memory_manager); |
| 16 | fermi_2d = std::make_unique<Engines::Fermi2D>(*memory_manager); | 17 | fermi_2d = std::make_unique<Engines::Fermi2D>(*memory_manager); |
| 17 | maxwell_compute = std::make_unique<Engines::MaxwellCompute>(); | 18 | maxwell_compute = std::make_unique<Engines::MaxwellCompute>(); |
| 18 | maxwell_dma = std::make_unique<Engines::MaxwellDMA>(*memory_manager); | 19 | maxwell_dma = std::make_unique<Engines::MaxwellDMA>(*memory_manager); |
diff --git a/src/video_core/gpu.h b/src/video_core/gpu.h index 08aa75503..440505c9d 100644 --- a/src/video_core/gpu.h +++ b/src/video_core/gpu.h | |||
| @@ -11,6 +11,10 @@ | |||
| 11 | #include "core/hle/service/nvflinger/buffer_queue.h" | 11 | #include "core/hle/service/nvflinger/buffer_queue.h" |
| 12 | #include "video_core/memory_manager.h" | 12 | #include "video_core/memory_manager.h" |
| 13 | 13 | ||
| 14 | namespace VideoCore { | ||
| 15 | class RasterizerInterface; | ||
| 16 | } | ||
| 17 | |||
| 14 | namespace Tegra { | 18 | namespace Tegra { |
| 15 | 19 | ||
| 16 | enum class RenderTargetFormat : u32 { | 20 | enum class RenderTargetFormat : u32 { |
| @@ -98,7 +102,7 @@ enum class EngineID { | |||
| 98 | 102 | ||
| 99 | class GPU final { | 103 | class GPU final { |
| 100 | public: | 104 | public: |
| 101 | GPU(); | 105 | explicit GPU(VideoCore::RasterizerInterface& rasterizer); |
| 102 | ~GPU(); | 106 | ~GPU(); |
| 103 | 107 | ||
| 104 | /// Processes a command list stored at the specified address in GPU memory. | 108 | /// Processes a command list stored at the specified address in GPU memory. |
diff --git a/src/video_core/renderer_base.cpp b/src/video_core/renderer_base.cpp index dbe3edf09..3ca350243 100644 --- a/src/video_core/renderer_base.cpp +++ b/src/video_core/renderer_base.cpp | |||
| @@ -7,6 +7,8 @@ | |||
| 7 | #include "video_core/renderer_base.h" | 7 | #include "video_core/renderer_base.h" |
| 8 | #include "video_core/renderer_opengl/gl_rasterizer.h" | 8 | #include "video_core/renderer_opengl/gl_rasterizer.h" |
| 9 | 9 | ||
| 10 | namespace VideoCore { | ||
| 11 | |||
| 10 | RendererBase::RendererBase(EmuWindow& window) : render_window{window} {} | 12 | RendererBase::RendererBase(EmuWindow& window) : render_window{window} {} |
| 11 | RendererBase::~RendererBase() = default; | 13 | RendererBase::~RendererBase() = default; |
| 12 | 14 | ||
| @@ -21,3 +23,5 @@ void RendererBase::RefreshRasterizerSetting() { | |||
| 21 | rasterizer = std::make_unique<RasterizerOpenGL>(render_window); | 23 | rasterizer = std::make_unique<RasterizerOpenGL>(render_window); |
| 22 | } | 24 | } |
| 23 | } | 25 | } |
| 26 | |||
| 27 | } // namespace VideoCore | ||
diff --git a/src/video_core/renderer_base.h b/src/video_core/renderer_base.h index 1cb161b7f..effb9aed3 100644 --- a/src/video_core/renderer_base.h +++ b/src/video_core/renderer_base.h | |||
| @@ -13,6 +13,8 @@ | |||
| 13 | 13 | ||
| 14 | class EmuWindow; | 14 | class EmuWindow; |
| 15 | 15 | ||
| 16 | namespace VideoCore { | ||
| 17 | |||
| 16 | class RendererBase : NonCopyable { | 18 | class RendererBase : NonCopyable { |
| 17 | public: | 19 | public: |
| 18 | /// Used to reference a framebuffer | 20 | /// Used to reference a framebuffer |
| @@ -44,7 +46,7 @@ public: | |||
| 44 | return m_current_frame; | 46 | return m_current_frame; |
| 45 | } | 47 | } |
| 46 | 48 | ||
| 47 | VideoCore::RasterizerInterface* Rasterizer() const { | 49 | RasterizerInterface* Rasterizer() const { |
| 48 | return rasterizer.get(); | 50 | return rasterizer.get(); |
| 49 | } | 51 | } |
| 50 | 52 | ||
| @@ -52,7 +54,9 @@ public: | |||
| 52 | 54 | ||
| 53 | protected: | 55 | protected: |
| 54 | EmuWindow& render_window; ///< Reference to the render window handle. | 56 | EmuWindow& render_window; ///< Reference to the render window handle. |
| 55 | std::unique_ptr<VideoCore::RasterizerInterface> rasterizer; | 57 | std::unique_ptr<RasterizerInterface> rasterizer; |
| 56 | f32 m_current_fps = 0.0f; ///< Current framerate, should be set by the renderer | 58 | f32 m_current_fps = 0.0f; ///< Current framerate, should be set by the renderer |
| 57 | int m_current_frame = 0; ///< Current frame, should be set by the renderer | 59 | int m_current_frame = 0; ///< Current frame, should be set by the renderer |
| 58 | }; | 60 | }; |
| 61 | |||
| 62 | } // namespace VideoCore | ||
diff --git a/src/video_core/renderer_opengl/renderer_opengl.cpp b/src/video_core/renderer_opengl/renderer_opengl.cpp index 74383c7cf..50846975f 100644 --- a/src/video_core/renderer_opengl/renderer_opengl.cpp +++ b/src/video_core/renderer_opengl/renderer_opengl.cpp | |||
| @@ -103,7 +103,7 @@ ScopeAcquireGLContext::~ScopeAcquireGLContext() { | |||
| 103 | } | 103 | } |
| 104 | } | 104 | } |
| 105 | 105 | ||
| 106 | RendererOpenGL::RendererOpenGL(EmuWindow& window) : RendererBase{window} {} | 106 | RendererOpenGL::RendererOpenGL(EmuWindow& window) : VideoCore::RendererBase{window} {} |
| 107 | RendererOpenGL::~RendererOpenGL() = default; | 107 | RendererOpenGL::~RendererOpenGL() = default; |
| 108 | 108 | ||
| 109 | /// Swap buffers (render frame) | 109 | /// Swap buffers (render frame) |
diff --git a/src/video_core/renderer_opengl/renderer_opengl.h b/src/video_core/renderer_opengl/renderer_opengl.h index ab7de41c8..428afa3b7 100644 --- a/src/video_core/renderer_opengl/renderer_opengl.h +++ b/src/video_core/renderer_opengl/renderer_opengl.h | |||
| @@ -41,7 +41,7 @@ private: | |||
| 41 | EmuWindow& emu_window; | 41 | EmuWindow& emu_window; |
| 42 | }; | 42 | }; |
| 43 | 43 | ||
| 44 | class RendererOpenGL : public RendererBase { | 44 | class RendererOpenGL : public VideoCore::RendererBase { |
| 45 | public: | 45 | public: |
| 46 | explicit RendererOpenGL(EmuWindow& window); | 46 | explicit RendererOpenGL(EmuWindow& window); |
| 47 | ~RendererOpenGL() override; | 47 | ~RendererOpenGL() override; |
diff --git a/src/video_core/video_core.cpp b/src/video_core/video_core.cpp index 06b13e681..5085ef96b 100644 --- a/src/video_core/video_core.cpp +++ b/src/video_core/video_core.cpp | |||
| @@ -3,37 +3,16 @@ | |||
| 3 | // Refer to the license.txt file included. | 3 | // Refer to the license.txt file included. |
| 4 | 4 | ||
| 5 | #include <memory> | 5 | #include <memory> |
| 6 | #include "common/logging/log.h" | ||
| 7 | #include "video_core/renderer_base.h" | 6 | #include "video_core/renderer_base.h" |
| 8 | #include "video_core/renderer_opengl/renderer_opengl.h" | 7 | #include "video_core/renderer_opengl/renderer_opengl.h" |
| 9 | #include "video_core/video_core.h" | 8 | #include "video_core/video_core.h" |
| 10 | 9 | ||
| 11 | //////////////////////////////////////////////////////////////////////////////////////////////////// | ||
| 12 | // Video Core namespace | ||
| 13 | |||
| 14 | namespace VideoCore { | 10 | namespace VideoCore { |
| 15 | 11 | ||
| 16 | std::unique_ptr<RendererBase> g_renderer; ///< Renderer plugin | ||
| 17 | |||
| 18 | std::atomic<bool> g_toggle_framelimit_enabled; | 12 | std::atomic<bool> g_toggle_framelimit_enabled; |
| 19 | 13 | ||
| 20 | /// Initialize the video core | 14 | std::unique_ptr<RendererBase> CreateRenderer(EmuWindow& emu_window) { |
| 21 | bool Init(EmuWindow& emu_window) { | 15 | return std::make_unique<RendererOpenGL>(emu_window); |
| 22 | g_renderer = std::make_unique<RendererOpenGL>(emu_window); | ||
| 23 | if (g_renderer->Init()) { | ||
| 24 | LOG_DEBUG(Render, "initialized OK"); | ||
| 25 | } else { | ||
| 26 | LOG_CRITICAL(Render, "initialization failed !"); | ||
| 27 | return false; | ||
| 28 | } | ||
| 29 | return true; | ||
| 30 | } | ||
| 31 | |||
| 32 | /// Shutdown the video core | ||
| 33 | void Shutdown() { | ||
| 34 | g_renderer.reset(); | ||
| 35 | |||
| 36 | LOG_DEBUG(Render, "shutdown OK"); | ||
| 37 | } | 16 | } |
| 38 | 17 | ||
| 39 | } // namespace VideoCore | 18 | } // namespace VideoCore |
diff --git a/src/video_core/video_core.h b/src/video_core/video_core.h index 519b757f5..7c01c0b8d 100644 --- a/src/video_core/video_core.h +++ b/src/video_core/video_core.h | |||
| @@ -8,25 +8,23 @@ | |||
| 8 | #include <memory> | 8 | #include <memory> |
| 9 | 9 | ||
| 10 | class EmuWindow; | 10 | class EmuWindow; |
| 11 | class RendererBase; | ||
| 12 | |||
| 13 | //////////////////////////////////////////////////////////////////////////////////////////////////// | ||
| 14 | // Video Core namespace | ||
| 15 | 11 | ||
| 16 | namespace VideoCore { | 12 | namespace VideoCore { |
| 17 | 13 | ||
| 18 | enum class Renderer { Software, OpenGL }; | 14 | class RendererBase; |
| 19 | 15 | ||
| 20 | extern std::unique_ptr<RendererBase> g_renderer; ///< Renderer plugin | 16 | enum class Renderer { Software, OpenGL }; |
| 21 | 17 | ||
| 22 | // TODO: Wrap these in a user settings struct along with any other graphics settings (often set from | 18 | // TODO: Wrap these in a user settings struct along with any other graphics settings (often set from |
| 23 | // qt ui) | 19 | // qt ui) |
| 24 | extern std::atomic<bool> g_toggle_framelimit_enabled; | 20 | extern std::atomic<bool> g_toggle_framelimit_enabled; |
| 25 | 21 | ||
| 26 | /// Initialize the video core | 22 | /** |
| 27 | bool Init(EmuWindow& emu_window); | 23 | * Creates a renderer instance. |
| 28 | 24 | * | |
| 29 | /// Shutdown the video core | 25 | * @note The returned renderer instance is simply allocated. Its Init() |
| 30 | void Shutdown(); | 26 | * function still needs to be called to fully complete its setup. |
| 27 | */ | ||
| 28 | std::unique_ptr<RendererBase> CreateRenderer(EmuWindow& emu_window); | ||
| 31 | 29 | ||
| 32 | } // namespace VideoCore | 30 | } // namespace VideoCore |