gpu: Move command processing to another thread.

This commit is contained in:
bunnei 2019-01-23 22:17:55 -05:00
parent 65651078e5
commit 7b574f406b
9 changed files with 358 additions and 15 deletions

View file

@ -19,6 +19,10 @@ namespace VideoCore {
class RendererBase;
} // namespace VideoCore
namespace VideoCommon::GPUThread {
class ThreadManager;
} // namespace VideoCommon::GPUThread
namespace Tegra {
enum class RenderTargetFormat : u32 {
@ -200,7 +204,7 @@ public:
std::array<u32, NUM_REGS> reg_array;
};
} regs{};
/// Push GPU command entries to be processed
void PushGPUEntries(Tegra::CommandList&& entries);
@ -208,6 +212,15 @@ public:
void SwapBuffers(
std::optional<std::reference_wrapper<const Tegra::FramebufferConfig>> framebuffer);
/// Notify rasterizer that any caches of the specified region should be flushed to Switch memory
void FlushRegion(VAddr addr, u64 size);
/// Notify rasterizer that any caches of the specified region should be invalidated
void InvalidateRegion(VAddr addr, u64 size);
/// Notify rasterizer that any caches of the specified region should be flushed and invalidated
void FlushAndInvalidateRegion(VAddr addr, u64 size);
private:
void ProcessBindMethod(const MethodCall& method_call);
void ProcessSemaphoreTriggerMethod();
@ -216,17 +229,18 @@ private:
/// Calls a GPU puller method.
void CallPullerMethod(const MethodCall& method_call);
/// Calls a GPU engine method.
void CallEngineMethod(const MethodCall& method_call);
/// Determines where the method should be executed.
bool ExecuteMethodOnEngine(const MethodCall& method_call);
private:
std::unique_ptr<Tegra::DmaPusher> dma_pusher;
std::unique_ptr<Tegra::MemoryManager> memory_manager;
std::unique_ptr<VideoCommon::GPUThread::ThreadManager> gpu_thread;
VideoCore::RendererBase& renderer;
/// Mapping of command subchannels to their bound engine ids.