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/gpu_thread.cpp | |
| 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/gpu_thread.cpp')
| -rw-r--r-- | src/video_core/gpu_thread.cpp | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/src/video_core/gpu_thread.cpp b/src/video_core/gpu_thread.cpp index 7e490bcc3..50319f1d5 100644 --- a/src/video_core/gpu_thread.cpp +++ b/src/video_core/gpu_thread.cpp | |||
| @@ -38,6 +38,7 @@ static void RunThread(Core::System& system, VideoCore::RendererBase& renderer, | |||
| 38 | } | 38 | } |
| 39 | 39 | ||
| 40 | auto current_context = context.Acquire(); | 40 | auto current_context = context.Acquire(); |
| 41 | VideoCore::RasterizerInterface* const rasterizer = renderer.ReadRasterizer(); | ||
| 41 | 42 | ||
| 42 | CommandDataContainer next; | 43 | CommandDataContainer next; |
| 43 | while (state.is_running) { | 44 | while (state.is_running) { |
| @@ -52,13 +53,13 @@ static void RunThread(Core::System& system, VideoCore::RendererBase& renderer, | |||
| 52 | } else if (const auto* data = std::get_if<SwapBuffersCommand>(&next.data)) { | 53 | } else if (const auto* data = std::get_if<SwapBuffersCommand>(&next.data)) { |
| 53 | renderer.SwapBuffers(data->framebuffer ? &*data->framebuffer : nullptr); | 54 | renderer.SwapBuffers(data->framebuffer ? &*data->framebuffer : nullptr); |
| 54 | } else if (std::holds_alternative<OnCommandListEndCommand>(next.data)) { | 55 | } else if (std::holds_alternative<OnCommandListEndCommand>(next.data)) { |
| 55 | renderer.Rasterizer().ReleaseFences(); | 56 | rasterizer->ReleaseFences(); |
| 56 | } else if (std::holds_alternative<GPUTickCommand>(next.data)) { | 57 | } else if (std::holds_alternative<GPUTickCommand>(next.data)) { |
| 57 | system.GPU().TickWork(); | 58 | system.GPU().TickWork(); |
| 58 | } else if (const auto* flush = std::get_if<FlushRegionCommand>(&next.data)) { | 59 | } else if (const auto* flush = std::get_if<FlushRegionCommand>(&next.data)) { |
| 59 | renderer.Rasterizer().FlushRegion(flush->addr, flush->size); | 60 | rasterizer->FlushRegion(flush->addr, flush->size); |
| 60 | } else if (const auto* invalidate = std::get_if<InvalidateRegionCommand>(&next.data)) { | 61 | } else if (const auto* invalidate = std::get_if<InvalidateRegionCommand>(&next.data)) { |
| 61 | renderer.Rasterizer().OnCPUWrite(invalidate->addr, invalidate->size); | 62 | rasterizer->OnCPUWrite(invalidate->addr, invalidate->size); |
| 62 | } else if (std::holds_alternative<EndProcessingCommand>(next.data)) { | 63 | } else if (std::holds_alternative<EndProcessingCommand>(next.data)) { |
| 63 | return; | 64 | return; |
| 64 | } else { | 65 | } else { |
| @@ -84,6 +85,7 @@ ThreadManager::~ThreadManager() { | |||
| 84 | void ThreadManager::StartThread(VideoCore::RendererBase& renderer, | 85 | void ThreadManager::StartThread(VideoCore::RendererBase& renderer, |
| 85 | Core::Frontend::GraphicsContext& context, | 86 | Core::Frontend::GraphicsContext& context, |
| 86 | Tegra::DmaPusher& dma_pusher, Tegra::CDmaPusher& cdma_pusher) { | 87 | Tegra::DmaPusher& dma_pusher, Tegra::CDmaPusher& cdma_pusher) { |
| 88 | rasterizer = renderer.ReadRasterizer(); | ||
| 87 | thread = std::thread(RunThread, std::ref(system), std::ref(renderer), std::ref(context), | 89 | thread = std::thread(RunThread, std::ref(system), std::ref(renderer), std::ref(context), |
| 88 | std::ref(dma_pusher), std::ref(state), std::ref(cdma_pusher)); | 90 | std::ref(dma_pusher), std::ref(state), std::ref(cdma_pusher)); |
| 89 | } | 91 | } |
| @@ -129,12 +131,12 @@ void ThreadManager::FlushRegion(VAddr addr, u64 size) { | |||
| 129 | } | 131 | } |
| 130 | 132 | ||
| 131 | void ThreadManager::InvalidateRegion(VAddr addr, u64 size) { | 133 | void ThreadManager::InvalidateRegion(VAddr addr, u64 size) { |
| 132 | system.Renderer().Rasterizer().OnCPUWrite(addr, size); | 134 | rasterizer->OnCPUWrite(addr, size); |
| 133 | } | 135 | } |
| 134 | 136 | ||
| 135 | void ThreadManager::FlushAndInvalidateRegion(VAddr addr, u64 size) { | 137 | void ThreadManager::FlushAndInvalidateRegion(VAddr addr, u64 size) { |
| 136 | // Skip flush on asynch mode, as FlushAndInvalidateRegion is not used for anything too important | 138 | // Skip flush on asynch mode, as FlushAndInvalidateRegion is not used for anything too important |
| 137 | system.Renderer().Rasterizer().OnCPUWrite(addr, size); | 139 | rasterizer->OnCPUWrite(addr, size); |
| 138 | } | 140 | } |
| 139 | 141 | ||
| 140 | void ThreadManager::WaitIdle() const { | 142 | void ThreadManager::WaitIdle() const { |