graphics: add experimental Pro mode and linear PSSR

Co-authored-by: Joshua Jayasingh <joshuajayasingh08@gmail.com>
This commit is contained in:
nmzikandJoshua Jayasingh committed 2026-10-29 07:55:50 +01:00
1 parent 5e837a9bea
commit 651ef73a03
30 files changed
+1340 -278

No files matched your search

@@ -3,6 +3,7 @@
#include "common/assert.h"
#include "graphics/guest_gpu/hardwareContext.h"
#include "graphics/guest_gpu/pssr.h"
#include "graphics/host_gpu/renderer/render.h"
#include "graphics/host_gpu/renderer/renderContext.h"
@@ -92,6 +93,7 @@ public:
uint32_t mode);
void DispatchIndirect(uint64_t args_addr, uint32_t mode);
void WaitFlipDone(uint32_t video_out_handle, uint32_t display_buffer_index);
void ProcessPssr(const Pssr::Request& request);
void TriggerEvent(uint32_t event_type, uint32_t event_index, uint64_t event_address = 0);
void WaitForRewind(bool valid);
@@ -226,6 +226,7 @@ constexpr auto MakeCustomOpcodeDispatchTable() {
g_cp_op_custom_func[Pm4::R_POP_MARKER] = CpOpPopMarker;
g_cp_op_custom_func[Pm4::R_FLIP] = CpOpFlip;
g_cp_op_custom_func[Pm4::R_CONTEXT_STATE] = CpOpContextState;
g_cp_op_custom_func[Pm4::R_PSSR] = CpOpPssr;
return g_cp_op_custom_func;
}
@@ -151,6 +151,7 @@ uint32_t CpOpPushMarker(CommandProcessor&, uint32_t, const uint32_t*, uint32_t,
uint32_t CpOpPopMarker(CommandProcessor&, uint32_t, const uint32_t*, uint32_t, uint32_t);
uint32_t CpOpWaitRegMem64(CommandProcessor&, uint32_t, const uint32_t*, uint32_t, uint32_t);
uint32_t CpOpFlip(CommandProcessor&, uint32_t, const uint32_t*, uint32_t, uint32_t);
uint32_t CpOpPssr(CommandProcessor&, uint32_t, const uint32_t*, uint32_t, uint32_t);
} // namespace Libs::Graphics
@@ -1706,6 +1706,17 @@ KYTY_CP_OP_PARSER(CpOpFlip) {
return 5;
}
KYTY_CP_OP_PARSER(CpOpPssr) {
KYTY_PROFILER_FUNCTION();
const auto packet_dw = KYTY_PM4_LEN(cmd_id) - 1;
EXIT_NOT_IMPLEMENTED(packet_dw < Pssr::RequestDwords || packet_dw > dw);
Pssr::Request request {};
std::memcpy(&request, buffer, sizeof(request));
cp.ProcessPssr(request);
return packet_dw;
}
KYTY_CP_OP_PARSER(CpOpIndexType) {
KYTY_PROFILER_FUNCTION();
+5
View File
@@ -929,6 +929,11 @@ void CommandProcessor::DispatchDirect(uint32_t thread_group_x, uint32_t thread_g
}
}
void CommandProcessor::ProcessPssr(const Pssr::Request& request) {
EXIT_NOT_IMPLEMENTED(IsAsyncComputeQueue());
m_renderer.GetRenderExecutor().ProcessPssr(CurrentBuffer(), request);
}
void CommandProcessor::DispatchIndirect(uint64_t args_addr, uint32_t mode) {
EXIT_NOT_IMPLEMENTED(args_addr == 0 || (args_addr & 3u) != 0);
if ((mode & Pm4::COMPUTE_DISPATCH_INITIATOR_USE_THREAD_DIMENSIONS) != 0) {
+1
View File
@@ -81,6 +81,7 @@ constexpr uint32_t R_WRITE_DATA = 0x15;
constexpr uint32_t R_FLIP = 0x17;
constexpr uint32_t R_DMA_DATA = 0x19;
constexpr uint32_t R_CONTEXT_STATE = 0x1A;
constexpr uint32_t R_PSSR = 0x1B;
constexpr uint32_t R_NUM = 0x3F + 1;
+20
View File
@@ -0,0 +1,20 @@
#ifndef EMULATOR_SRC_GRAPHICS_GUEST_GPU_PSSR_H_
#define EMULATOR_SRC_GRAPHICS_GUEST_GPU_PSSR_H_
#include <cstdint>
namespace Libs::Graphics::Pssr {
struct Request {
uint32_t output[8];
uint32_t input[8];
uint32_t width;
uint32_t height;
};
constexpr uint32_t RequestDwords = sizeof(Request) / sizeof(uint32_t);
static_assert(sizeof(Request) == 72);
} // namespace Libs::Graphics::Pssr
#endif // EMULATOR_SRC_GRAPHICS_GUEST_GPU_PSSR_H_