|
|
|
@ -185,16 +185,6 @@ struct GPU::Impl { |
|
|
|
return *dma_pusher; |
|
|
|
} |
|
|
|
|
|
|
|
/// Returns a reference to the GPU CDMA pusher.
|
|
|
|
[[nodiscard]] Tegra::CDmaPusher& CDmaPusher() { |
|
|
|
return *cdma_pusher; |
|
|
|
} |
|
|
|
|
|
|
|
/// Returns a const reference to the GPU CDMA pusher.
|
|
|
|
[[nodiscard]] const Tegra::CDmaPusher& CDmaPusher() const { |
|
|
|
return *cdma_pusher; |
|
|
|
} |
|
|
|
|
|
|
|
/// Returns a reference to the underlying renderer.
|
|
|
|
[[nodiscard]] VideoCore::RendererBase& Renderer() { |
|
|
|
return *renderer; |
|
|
|
@ -338,25 +328,26 @@ struct GPU::Impl { |
|
|
|
} |
|
|
|
|
|
|
|
/// Push GPU command buffer entries to be processed
|
|
|
|
void PushCommandBuffer(Tegra::ChCommandHeaderList& entries) { |
|
|
|
void PushCommandBuffer(u32 id, Tegra::ChCommandHeaderList& entries) { |
|
|
|
if (!use_nvdec) { |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
if (!cdma_pusher) { |
|
|
|
cdma_pusher = std::make_unique<Tegra::CDmaPusher>(gpu); |
|
|
|
if (cdma_pushers.find(id) == cdma_pushers.end()) { |
|
|
|
cdma_pushers[id] = std::make_unique<Tegra::CDmaPusher>(gpu); |
|
|
|
} |
|
|
|
|
|
|
|
// SubmitCommandBuffer would make the nvdec operations async, this is not currently working
|
|
|
|
// TODO(ameerj): RE proper async nvdec operation
|
|
|
|
// gpu_thread.SubmitCommandBuffer(std::move(entries));
|
|
|
|
|
|
|
|
cdma_pusher->ProcessEntries(std::move(entries)); |
|
|
|
cdma_pushers[id]->ProcessEntries(std::move(entries)); |
|
|
|
} |
|
|
|
|
|
|
|
/// Frees the CDMAPusher instance to free up resources
|
|
|
|
void ClearCdmaInstance() { |
|
|
|
cdma_pusher.reset(); |
|
|
|
void ClearCdmaInstance(u32 id) { |
|
|
|
if (cdma_pushers.find(id) != cdma_pushers.end()) { |
|
|
|
cdma_pushers.erase(id); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/// Swap buffers (render frame)
|
|
|
|
@ -659,7 +650,7 @@ struct GPU::Impl { |
|
|
|
Core::System& system; |
|
|
|
std::unique_ptr<Tegra::MemoryManager> memory_manager; |
|
|
|
std::unique_ptr<Tegra::DmaPusher> dma_pusher; |
|
|
|
std::unique_ptr<Tegra::CDmaPusher> cdma_pusher; |
|
|
|
std::map<u32, std::unique_ptr<Tegra::CDmaPusher>> cdma_pushers; |
|
|
|
std::unique_ptr<VideoCore::RendererBase> renderer; |
|
|
|
VideoCore::RasterizerInterface* rasterizer = nullptr; |
|
|
|
const bool use_nvdec; |
|
|
|
@ -811,14 +802,6 @@ const Tegra::DmaPusher& GPU::DmaPusher() const { |
|
|
|
return impl->DmaPusher(); |
|
|
|
} |
|
|
|
|
|
|
|
Tegra::CDmaPusher& GPU::CDmaPusher() { |
|
|
|
return impl->CDmaPusher(); |
|
|
|
} |
|
|
|
|
|
|
|
const Tegra::CDmaPusher& GPU::CDmaPusher() const { |
|
|
|
return impl->CDmaPusher(); |
|
|
|
} |
|
|
|
|
|
|
|
VideoCore::RendererBase& GPU::Renderer() { |
|
|
|
return impl->Renderer(); |
|
|
|
} |
|
|
|
@ -887,12 +870,12 @@ void GPU::PushGPUEntries(Tegra::CommandList&& entries) { |
|
|
|
impl->PushGPUEntries(std::move(entries)); |
|
|
|
} |
|
|
|
|
|
|
|
void GPU::PushCommandBuffer(Tegra::ChCommandHeaderList& entries) { |
|
|
|
impl->PushCommandBuffer(entries); |
|
|
|
void GPU::PushCommandBuffer(u32 id, Tegra::ChCommandHeaderList& entries) { |
|
|
|
impl->PushCommandBuffer(id, entries); |
|
|
|
} |
|
|
|
|
|
|
|
void GPU::ClearCdmaInstance() { |
|
|
|
impl->ClearCdmaInstance(); |
|
|
|
void GPU::ClearCdmaInstance(u32 id) { |
|
|
|
impl->ClearCdmaInstance(id); |
|
|
|
} |
|
|
|
|
|
|
|
void GPU::SwapBuffers(const Tegra::FramebufferConfig* framebuffer) { |
|
|
|
|