mirror of
https://github.com/KytyPS5/KytyPS5.git
synced 2026-10-20 19:07:01 +02:00
93 lines
3.6 KiB
C++
93 lines
3.6 KiB
C++
#ifndef EMULATOR_SRC_GRAPHICS_HOST_GPU_RENDERER_RENDERCONTEXT_H_
|
|
#define EMULATOR_SRC_GRAPHICS_HOST_GPU_RENDERER_RENDERCONTEXT_H_
|
|
|
|
#include "common/abi.h"
|
|
#include "common/assert.h"
|
|
#include "common/common.h"
|
|
#include "common/threads.h"
|
|
#include "graphics/host_gpu/pageManager.h"
|
|
#include "graphics/host_gpu/rangeSet.h"
|
|
#include "graphics/host_gpu/renderer/cache/bufferCache.h"
|
|
#include "graphics/host_gpu/renderer/cache/samplerCache.h"
|
|
#include "graphics/host_gpu/renderer/cache/textureCache.h"
|
|
#include "graphics/host_gpu/renderer/commandScheduler.h"
|
|
#include "graphics/host_gpu/renderer/pipeline/descriptorHeap.h"
|
|
#include "graphics/host_gpu/renderer/pipeline/pipelineCache.h"
|
|
#include "kernel/eventQueue.h"
|
|
|
|
#include <memory>
|
|
#include <shared_mutex>
|
|
#include <vector>
|
|
|
|
namespace Libs::VideoOut {
|
|
class VideoOutDriver;
|
|
}
|
|
|
|
namespace Libs::Graphics {
|
|
|
|
class GuestGpu;
|
|
|
|
class RenderContext {
|
|
public:
|
|
explicit RenderContext(GraphicContext& graphics);
|
|
~RenderContext();
|
|
KYTY_CLASS_NO_COPY(RenderContext);
|
|
|
|
[[nodiscard]] GraphicContext& GetGraphics() const noexcept { return m_graphics; }
|
|
void InitializeGpu(VideoOut::VideoOutDriver* video_out);
|
|
void ShutdownGpu();
|
|
[[nodiscard]] GuestGpu& GetGpu() const;
|
|
[[nodiscard]] VideoOut::VideoOutDriver& GetVideoOut() const;
|
|
|
|
Common::Mutex& GetMutex() { return m_mutex; }
|
|
CommandScheduler& GetCommandScheduler() { return m_command_scheduler; }
|
|
PipelineCache& GetPipelineCache() { return m_pipeline_cache; }
|
|
DescriptorHeap& GetDescriptorHeap() { return m_descriptor_heap; }
|
|
SamplerCache& GetSamplerCache() { return m_sampler_cache; }
|
|
BufferCache& GetBufferCache() { return m_buffer_cache; }
|
|
TextureCache& GetTextureCache() { return m_texture_cache; }
|
|
RenderExecutor& GetRenderExecutor() { return m_render_executor; }
|
|
|
|
[[nodiscard]] bool HandleFault(PageFaultAccess access, uint64_t fault_vaddr) noexcept;
|
|
[[nodiscard]] bool InvalidateMemory(uint64_t vaddr, uint64_t size);
|
|
[[nodiscard]] bool IsMapped(uint64_t vaddr, uint64_t size) const noexcept;
|
|
void MapMemory(uint64_t vaddr, uint64_t size);
|
|
void UnmapMemory(uint64_t vaddr, uint64_t size);
|
|
void PrepareBda();
|
|
void RunGarbageCollector();
|
|
|
|
void AddInterruptEq(LibKernel::EventQueue::KernelEqueue eq, int event_id);
|
|
void DeleteInterruptEq(LibKernel::EventQueue::KernelEqueue eq, int event_id);
|
|
void TriggerInterrupt(int event_id, uint32_t context_id);
|
|
|
|
private:
|
|
struct InterruptEqRegistration {
|
|
LibKernel::EventQueue::KernelEqueue eq = LibKernel::EventQueue::KERNEL_EQUEUE_INVALID;
|
|
int event_id = 0;
|
|
};
|
|
|
|
GraphicContext& m_graphics;
|
|
Common::Mutex m_mutex;
|
|
RenderExecutor m_render_executor;
|
|
CommandScheduler m_command_scheduler;
|
|
DescriptorHeap m_descriptor_heap;
|
|
PipelineCache m_pipeline_cache;
|
|
SamplerCache m_sampler_cache;
|
|
PageManager m_page_manager;
|
|
BufferCache m_buffer_cache;
|
|
TextureCache m_texture_cache;
|
|
mutable std::shared_mutex m_mapped_ranges_mutex;
|
|
RangeSet m_mapped_ranges;
|
|
std::unique_ptr<GuestGpu> m_gpu;
|
|
VideoOut::VideoOutDriver* m_video_out = nullptr;
|
|
bool m_fault_process_pending = false;
|
|
bool m_bda_logged = false;
|
|
|
|
Common::Mutex m_interrupt_mutex;
|
|
std::vector<InterruptEqRegistration> m_interrupt_eqs;
|
|
};
|
|
|
|
} // namespace Libs::Graphics
|
|
|
|
#endif // EMULATOR_SRC_GRAPHICS_HOST_GPU_RENDERER_RENDERCONTEXT_H_
|