summaryrefslogtreecommitdiff
path: root/src/video_core/gpu_thread.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/video_core/gpu_thread.cpp')
-rw-r--r--src/video_core/gpu_thread.cpp12
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() {
84void ThreadManager::StartThread(VideoCore::RendererBase& renderer, 85void 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
131void ThreadManager::InvalidateRegion(VAddr addr, u64 size) { 133void ThreadManager::InvalidateRegion(VAddr addr, u64 size) {
132 system.Renderer().Rasterizer().OnCPUWrite(addr, size); 134 rasterizer->OnCPUWrite(addr, size);
133} 135}
134 136
135void ThreadManager::FlushAndInvalidateRegion(VAddr addr, u64 size) { 137void 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
140void ThreadManager::WaitIdle() const { 142void ThreadManager::WaitIdle() const {