summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/core')
-rw-r--r--src/core/core.cpp9
-rw-r--r--src/core/core.h22
-rw-r--r--src/core/hle/service/nvdrv/devices/nvdisp_disp0.cpp6
-rw-r--r--src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp11
-rw-r--r--src/core/hle/service/nvflinger/nvflinger.cpp6
-rw-r--r--src/core/memory.cpp24
-rw-r--r--src/core/settings.cpp6
7 files changed, 57 insertions, 27 deletions
diff --git a/src/core/core.cpp b/src/core/core.cpp
index e51e66550..e01c45cdd 100644
--- a/src/core/core.cpp
+++ b/src/core/core.cpp
@@ -18,6 +18,7 @@
18#include "core/loader/loader.h" 18#include "core/loader/loader.h"
19#include "core/settings.h" 19#include "core/settings.h"
20#include "file_sys/vfs_real.h" 20#include "file_sys/vfs_real.h"
21#include "video_core/renderer_base.h"
21#include "video_core/video_core.h" 22#include "video_core/video_core.h"
22 23
23namespace Core { 24namespace Core {
@@ -178,7 +179,6 @@ System::ResultStatus System::Init(EmuWindow& emu_window) {
178 cpu_cores[index] = std::make_shared<Cpu>(cpu_exclusive_monitor, cpu_barrier, index); 179 cpu_cores[index] = std::make_shared<Cpu>(cpu_exclusive_monitor, cpu_barrier, index);
179 } 180 }
180 181
181 gpu_core = std::make_unique<Tegra::GPU>();
182 telemetry_session = std::make_unique<Core::TelemetrySession>(); 182 telemetry_session = std::make_unique<Core::TelemetrySession>();
183 service_manager = std::make_shared<Service::SM::ServiceManager>(); 183 service_manager = std::make_shared<Service::SM::ServiceManager>();
184 184
@@ -186,10 +186,13 @@ System::ResultStatus System::Init(EmuWindow& emu_window) {
186 Service::Init(service_manager); 186 Service::Init(service_manager);
187 GDBStub::Init(); 187 GDBStub::Init();
188 188
189 if (!VideoCore::Init(emu_window)) { 189 renderer = VideoCore::CreateRenderer(emu_window);
190 if (!renderer->Init()) {
190 return ResultStatus::ErrorVideoCore; 191 return ResultStatus::ErrorVideoCore;
191 } 192 }
192 193
194 gpu_core = std::make_unique<Tegra::GPU>(renderer->Rasterizer());
195
193 // Create threads for CPU cores 1-3, and build thread_to_cpu map 196 // Create threads for CPU cores 1-3, and build thread_to_cpu map
194 // CPU core 0 is run on the main thread 197 // CPU core 0 is run on the main thread
195 thread_to_cpu[std::this_thread::get_id()] = cpu_cores[0]; 198 thread_to_cpu[std::this_thread::get_id()] = cpu_cores[0];
@@ -221,7 +224,7 @@ void System::Shutdown() {
221 perf_results.frametime * 1000.0); 224 perf_results.frametime * 1000.0);
222 225
223 // Shutdown emulation session 226 // Shutdown emulation session
224 VideoCore::Shutdown(); 227 renderer.reset();
225 GDBStub::Shutdown(); 228 GDBStub::Shutdown();
226 Service::Shutdown(); 229 Service::Shutdown();
227 Kernel::Shutdown(); 230 Kernel::Shutdown();
diff --git a/src/core/core.h b/src/core/core.h
index 4c9967559..a3be88aa8 100644
--- a/src/core/core.h
+++ b/src/core/core.h
@@ -27,6 +27,10 @@ namespace Service::SM {
27class ServiceManager; 27class ServiceManager;
28} 28}
29 29
30namespace VideoCore {
31class RendererBase;
32}
33
30namespace Core { 34namespace Core {
31 35
32class System { 36class System {
@@ -129,11 +133,26 @@ public:
129 /// Gets a CPU interface to the CPU core with the specified index 133 /// Gets a CPU interface to the CPU core with the specified index
130 Cpu& CpuCore(size_t core_index); 134 Cpu& CpuCore(size_t core_index);
131 135
132 /// Gets the GPU interface 136 /// Gets a mutable reference to the GPU interface
133 Tegra::GPU& GPU() { 137 Tegra::GPU& GPU() {
134 return *gpu_core; 138 return *gpu_core;
135 } 139 }
136 140
141 /// Gets an immutable reference to the GPU interface.
142 const Tegra::GPU& GPU() const {
143 return *gpu_core;
144 }
145
146 /// Gets a mutable reference to the renderer.
147 VideoCore::RendererBase& Renderer() {
148 return *renderer;
149 }
150
151 /// Gets an immutable reference to the renderer.
152 const VideoCore::RendererBase& Renderer() const {
153 return *renderer;
154 }
155
137 /// Gets the scheduler for the CPU core that is currently running 156 /// Gets the scheduler for the CPU core that is currently running
138 Kernel::Scheduler& CurrentScheduler() { 157 Kernel::Scheduler& CurrentScheduler() {
139 return *CurrentCpuCore().Scheduler(); 158 return *CurrentCpuCore().Scheduler();
@@ -197,6 +216,7 @@ private:
197 216
198 /// AppLoader used to load the current executing application 217 /// AppLoader used to load the current executing application
199 std::unique_ptr<Loader::AppLoader> app_loader; 218 std::unique_ptr<Loader::AppLoader> app_loader;
219 std::unique_ptr<VideoCore::RendererBase> renderer;
200 std::unique_ptr<Tegra::GPU> gpu_core; 220 std::unique_ptr<Tegra::GPU> gpu_core;
201 std::shared_ptr<Tegra::DebugContext> debug_context; 221 std::shared_ptr<Tegra::DebugContext> debug_context;
202 Kernel::SharedPtr<Kernel::Process> current_process; 222 Kernel::SharedPtr<Kernel::Process> current_process;
diff --git a/src/core/hle/service/nvdrv/devices/nvdisp_disp0.cpp b/src/core/hle/service/nvdrv/devices/nvdisp_disp0.cpp
index ed69a4325..2b74e6a33 100644
--- a/src/core/hle/service/nvdrv/devices/nvdisp_disp0.cpp
+++ b/src/core/hle/service/nvdrv/devices/nvdisp_disp0.cpp
@@ -30,9 +30,9 @@ void nvdisp_disp0::flip(u32 buffer_handle, u32 offset, u32 format, u32 width, u3
30 addr, offset, width, height, stride, static_cast<PixelFormat>(format), 30 addr, offset, width, height, stride, static_cast<PixelFormat>(format),
31 transform, crop_rect}; 31 transform, crop_rect};
32 32
33 Core::System::GetInstance().perf_stats.EndGameFrame(); 33 auto& instance = Core::System::GetInstance();
34 34 instance.perf_stats.EndGameFrame();
35 VideoCore::g_renderer->SwapBuffers(framebuffer); 35 instance.Renderer().SwapBuffers(framebuffer);
36} 36}
37 37
38} // namespace Service::Nvidia::Devices 38} // namespace Service::Nvidia::Devices
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp b/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp
index 57b128b40..4b601781f 100644
--- a/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp
+++ b/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp
@@ -150,15 +150,16 @@ u32 nvhost_as_gpu::UnmapBuffer(const std::vector<u8>& input, std::vector<u8>& ou
150 150
151 LOG_DEBUG(Service_NVDRV, "called, offset=0x{:X}", params.offset); 151 LOG_DEBUG(Service_NVDRV, "called, offset=0x{:X}", params.offset);
152 152
153 auto& gpu = Core::System::GetInstance().GPU(); 153 const auto itr = buffer_mappings.find(params.offset);
154
155 auto itr = buffer_mappings.find(params.offset);
156
157 ASSERT_MSG(itr != buffer_mappings.end(), "Tried to unmap invalid mapping"); 154 ASSERT_MSG(itr != buffer_mappings.end(), "Tried to unmap invalid mapping");
158 155
156 auto& system_instance = Core::System::GetInstance();
157
159 // Remove this memory region from the rasterizer cache. 158 // Remove this memory region from the rasterizer cache.
160 VideoCore::g_renderer->Rasterizer()->FlushAndInvalidateRegion(params.offset, itr->second.size); 159 system_instance.Renderer().Rasterizer().FlushAndInvalidateRegion(params.offset,
160 itr->second.size);
161 161
162 auto& gpu = system_instance.GPU();
162 params.offset = gpu.memory_manager->UnmapBuffer(params.offset, itr->second.size); 163 params.offset = gpu.memory_manager->UnmapBuffer(params.offset, itr->second.size);
163 164
164 buffer_mappings.erase(itr->second.offset); 165 buffer_mappings.erase(itr->second.offset);
diff --git a/src/core/hle/service/nvflinger/nvflinger.cpp b/src/core/hle/service/nvflinger/nvflinger.cpp
index 5344441e1..0bf51062c 100644
--- a/src/core/hle/service/nvflinger/nvflinger.cpp
+++ b/src/core/hle/service/nvflinger/nvflinger.cpp
@@ -127,9 +127,11 @@ void NVFlinger::Compose() {
127 MicroProfileFlip(); 127 MicroProfileFlip();
128 128
129 if (buffer == boost::none) { 129 if (buffer == boost::none) {
130 auto& system_instance = Core::System::GetInstance();
131
130 // There was no queued buffer to draw, render previous frame 132 // There was no queued buffer to draw, render previous frame
131 Core::System::GetInstance().perf_stats.EndGameFrame(); 133 system_instance.perf_stats.EndGameFrame();
132 VideoCore::g_renderer->SwapBuffers({}); 134 system_instance.Renderer().SwapBuffers({});
133 continue; 135 continue;
134 } 136 }
135 137
diff --git a/src/core/memory.cpp b/src/core/memory.cpp
index 4b3bb7b31..1133bcbaf 100644
--- a/src/core/memory.cpp
+++ b/src/core/memory.cpp
@@ -326,43 +326,45 @@ void RasterizerMarkRegionCached(Tegra::GPUVAddr gpu_addr, u64 size, bool cached)
326} 326}
327 327
328void RasterizerFlushVirtualRegion(VAddr start, u64 size, FlushMode mode) { 328void RasterizerFlushVirtualRegion(VAddr start, u64 size, FlushMode mode) {
329 auto& system_instance = Core::System::GetInstance();
330
329 // Since pages are unmapped on shutdown after video core is shutdown, the renderer may be 331 // Since pages are unmapped on shutdown after video core is shutdown, the renderer may be
330 // null here 332 // null here
331 if (VideoCore::g_renderer == nullptr) { 333 if (!system_instance.IsPoweredOn()) {
332 return; 334 return;
333 } 335 }
334 336
335 VAddr end = start + size; 337 VAddr end = start + size;
336 338
337 auto CheckRegion = [&](VAddr region_start, VAddr region_end) { 339 const auto CheckRegion = [&](VAddr region_start, VAddr region_end) {
338 if (start >= region_end || end <= region_start) { 340 if (start >= region_end || end <= region_start) {
339 // No overlap with region 341 // No overlap with region
340 return; 342 return;
341 } 343 }
342 344
343 VAddr overlap_start = std::max(start, region_start); 345 const VAddr overlap_start = std::max(start, region_start);
344 VAddr overlap_end = std::min(end, region_end); 346 const VAddr overlap_end = std::min(end, region_end);
345 347
346 std::vector<Tegra::GPUVAddr> gpu_addresses = 348 const std::vector<Tegra::GPUVAddr> gpu_addresses =
347 Core::System::GetInstance().GPU().memory_manager->CpuToGpuAddress(overlap_start); 349 system_instance.GPU().memory_manager->CpuToGpuAddress(overlap_start);
348 350
349 if (gpu_addresses.empty()) { 351 if (gpu_addresses.empty()) {
350 return; 352 return;
351 } 353 }
352 354
353 u64 overlap_size = overlap_end - overlap_start; 355 const u64 overlap_size = overlap_end - overlap_start;
354 356
355 for (const auto& gpu_address : gpu_addresses) { 357 for (const auto& gpu_address : gpu_addresses) {
356 auto* rasterizer = VideoCore::g_renderer->Rasterizer(); 358 auto& rasterizer = system_instance.Renderer().Rasterizer();
357 switch (mode) { 359 switch (mode) {
358 case FlushMode::Flush: 360 case FlushMode::Flush:
359 rasterizer->FlushRegion(gpu_address, overlap_size); 361 rasterizer.FlushRegion(gpu_address, overlap_size);
360 break; 362 break;
361 case FlushMode::Invalidate: 363 case FlushMode::Invalidate:
362 rasterizer->InvalidateRegion(gpu_address, overlap_size); 364 rasterizer.InvalidateRegion(gpu_address, overlap_size);
363 break; 365 break;
364 case FlushMode::FlushAndInvalidate: 366 case FlushMode::FlushAndInvalidate:
365 rasterizer->FlushAndInvalidateRegion(gpu_address, overlap_size); 367 rasterizer.FlushAndInvalidateRegion(gpu_address, overlap_size);
366 break; 368 break;
367 } 369 }
368 } 370 }
diff --git a/src/core/settings.cpp b/src/core/settings.cpp
index 79e0b347b..a4623223d 100644
--- a/src/core/settings.cpp
+++ b/src/core/settings.cpp
@@ -2,6 +2,7 @@
2// Licensed under GPLv2 or any later version 2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included. 3// Refer to the license.txt file included.
4 4
5#include "core/core.h"
5#include "core/gdbstub/gdbstub.h" 6#include "core/gdbstub/gdbstub.h"
6#include "core/hle/service/hid/hid.h" 7#include "core/hle/service/hid/hid.h"
7#include "core/settings.h" 8#include "core/settings.h"
@@ -19,8 +20,9 @@ void Apply() {
19 20
20 VideoCore::g_toggle_framelimit_enabled = values.toggle_framelimit; 21 VideoCore::g_toggle_framelimit_enabled = values.toggle_framelimit;
21 22
22 if (VideoCore::g_renderer) { 23 auto& system_instance = Core::System::GetInstance();
23 VideoCore::g_renderer->UpdateCurrentFramebufferLayout(); 24 if (system_instance.IsPoweredOn()) {
25 system_instance.Renderer().UpdateCurrentFramebufferLayout();
24 } 26 }
25 27
26 Service::HID::ReloadInputDevices(); 28 Service::HID::ReloadInputDevices();