Split render header (new namespace PM4 call sites)

This commit is contained in:
nmzik
2026-07-17 14:20:16 +02:00
parent f9af3d15ff
commit c7b00d666f
6 changed files with 134 additions and 118 deletions
+26 -25
View File
@@ -15,6 +15,7 @@
#include "graphics/host_gpu/objects/label.h" #include "graphics/host_gpu/objects/label.h"
#include "graphics/host_gpu/renderer/render.h" #include "graphics/host_gpu/renderer/render.h"
#include "graphics/host_gpu/renderer/renderContext.h" #include "graphics/host_gpu/renderer/renderContext.h"
#include "graphics/host_gpu/renderer/sync.h"
#include "graphics/presentation/displayBuffer.h" #include "graphics/presentation/displayBuffer.h"
#include "graphics/presentation/videoOut.h" #include "graphics/presentation/videoOut.h"
#include "graphics/presentation/window.h" #include "graphics/presentation/window.h"
@@ -449,7 +450,7 @@ void CommandProcessor::Reset() {
Common::LockGuard lock(m_mutex); Common::LockGuard lock(m_mutex);
GraphicsRenderDeleteBuffers(); Sync::DeleteBuffers();
m_sh_ctx.Reset(); m_sh_ctx.Reset();
m_ucfg.Reset(); m_ucfg.Reset();
@@ -660,7 +661,7 @@ void CommandProcessor::WriteReferenceClock(uint64_t dst_address, uint32_t num_by
EXIT("invalid reference-clock copy, dst=0x%016" PRIx64 " size=%u\n", dst_address, EXIT("invalid reference-clock copy, dst=0x%016" PRIx64 " size=%u\n", dst_address,
num_bytes); num_bytes);
} }
const auto value = GraphicsRenderReadReferenceClock(); const auto value = Sync::ReadReferenceClock();
std::memcpy(reinterpret_cast<void*>(dst_address), &value, num_bytes); std::memcpy(reinterpret_cast<void*>(dst_address), &value, num_bytes);
LOGF("\t copy_data reference clock: dst=0x%016" PRIx64 " value=0x%016" PRIx64 " size=%u\n", LOGF("\t copy_data reference clock: dst=0x%016" PRIx64 " value=0x%016" PRIx64 " size=%u\n",
dst_address, value, num_bytes); dst_address, value, num_bytes);
@@ -826,7 +827,7 @@ void GraphicsRing::ThreadBatchRun(void* data) {
ring->m_constant_job.Wait(); ring->m_constant_job.Wait();
cp->BufferFlush(); cp->BufferFlush();
if (buf.trigger_agc_interrupt_on_done) { if (buf.trigger_agc_interrupt_on_done) {
GraphicsRenderTriggerEopEvent(0); Sync::TriggerEopEvent(0);
} }
} }
} }
@@ -907,7 +908,7 @@ void ComputeRing::ThreadRun(void* data) {
cp->BufferFlush(); cp->BufferFlush();
if (trigger_agc_interrupt_on_done) { if (trigger_agc_interrupt_on_done) {
GraphicsRenderTriggerAgcUserInterrupt(); Sync::TriggerAgcUserInterrupt();
} }
} }
cp->RunUnlock(); cp->RunUnlock();
@@ -1526,7 +1527,7 @@ void CommandProcessor::WriteAtEndOfPipe(uint32_t cache_policy, uint32_t event_wr
case 0x00: case 0x00:
case 0x03: with_interrupt = false; break; case 0x03: with_interrupt = false; break;
case 0x01: case 0x01:
GraphicsRenderTriggerEopEventAtEndOfPipe(CurrentBuffer(), interrupt_context_id); Sync::TriggerEopEventAtEndOfPipe(CurrentBuffer(), interrupt_context_id);
return; return;
case 0x02: with_interrupt = true; break; case 0x02: with_interrupt = true; break;
default: EXIT("unknown interrupt_selector\n"); default: EXIT("unknown interrupt_selector\n");
@@ -1539,16 +1540,16 @@ void CommandProcessor::WriteAtEndOfPipe(uint32_t cache_policy, uint32_t event_wr
if (with_interrupt) { if (with_interrupt) {
if (with_writeback) { if (with_writeback) {
GraphicsRenderWriteAtEndOfPipeWithInterruptWriteBack32( Sync::WriteAtEndOfPipeWithInterruptWriteBack32(
m_submit_id, CurrentBuffer(), dst, data, interrupt_context_id); m_submit_id, CurrentBuffer(), dst, data, interrupt_context_id);
} else { } else {
GraphicsRenderWriteAtEndOfPipeWithInterrupt32(m_submit_id, CurrentBuffer(), dst, Sync::WriteAtEndOfPipeWithInterrupt32(m_submit_id, CurrentBuffer(), dst,
data, interrupt_context_id); data, interrupt_context_id);
} }
} else if (with_writeback) { } else if (with_writeback) {
GraphicsRenderWriteAtEndOfPipeWithWriteBack32(m_submit_id, CurrentBuffer(), dst, data); Sync::WriteAtEndOfPipeWithWriteBack32(m_submit_id, CurrentBuffer(), dst, data);
} else { } else {
GraphicsRenderWriteAtEndOfPipe32(m_submit_id, CurrentBuffer(), dst, data); Sync::WriteAtEndOfPipe32(m_submit_id, CurrentBuffer(), dst, data);
} }
}; };
@@ -1558,8 +1559,8 @@ void CommandProcessor::WriteAtEndOfPipe(uint32_t cache_policy, uint32_t event_wr
if (eop_event_type == 0x2f && cache_action == 0x00 && event_index == 0x06) { if (eop_event_type == 0x2f && cache_action == 0x00 && event_index == 0x06) {
auto* dst = static_cast<uint32_t*>(dst_gpu_addr); auto* dst = static_cast<uint32_t*>(dst_gpu_addr);
SynchronizeGpu(); SynchronizeGpu();
GraphicsRenderReadGds(dst, value & 0xffffu, value >> 16u); Sync::ReadGds(dst, value & 0xffffu, value >> 16u);
GraphicsRenderWriteAtEndOfPipeGds32(m_submit_id, CurrentBuffer(), dst, Sync::WriteAtEndOfPipeGds32(m_submit_id, CurrentBuffer(), dst,
value & 0xffffu, value >> 16u); value & 0xffffu, value >> 16u);
return; return;
} }
@@ -1584,17 +1585,17 @@ void CommandProcessor::WriteAtEndOfPipe(uint32_t cache_policy, uint32_t event_wr
if (with_interrupt) { if (with_interrupt) {
if (with_writeback) { if (with_writeback) {
GraphicsRenderWriteAtEndOfPipeWithInterruptWriteBack64( Sync::WriteAtEndOfPipeWithInterruptWriteBack64(
m_submit_id, CurrentBuffer(), dst, value, interrupt_context_id); m_submit_id, CurrentBuffer(), dst, value, interrupt_context_id);
} else { } else {
GraphicsRenderWriteAtEndOfPipeWithInterrupt64( Sync::WriteAtEndOfPipeWithInterrupt64(
m_submit_id, CurrentBuffer(), dst, value, interrupt_context_id); m_submit_id, CurrentBuffer(), dst, value, interrupt_context_id);
} }
} else if (with_writeback) { } else if (with_writeback) {
GraphicsRenderWriteAtEndOfPipeWithWriteBack64(m_submit_id, CurrentBuffer(), Sync::WriteAtEndOfPipeWithWriteBack64(m_submit_id, CurrentBuffer(),
dst, value); dst, value);
} else { } else {
GraphicsRenderWriteAtEndOfPipe64(m_submit_id, CurrentBuffer(), dst, value); Sync::WriteAtEndOfPipe64(m_submit_id, CurrentBuffer(), dst, value);
} }
}; };
@@ -1661,14 +1662,14 @@ void CommandProcessor::WriteAtEndOfPipe(uint32_t cache_policy, uint32_t event_wr
break; break;
case 0x04: case 0x04:
if constexpr (sizeof(T) == sizeof(uint64_t)) { if constexpr (sizeof(T) == sizeof(uint64_t)) {
const auto clock = GraphicsRenderReadReferenceClock(); const auto clock = Sync::ReadReferenceClock();
std::memcpy(dst_gpu_addr, &clock, sizeof(clock)); std::memcpy(dst_gpu_addr, &clock, sizeof(clock));
switch (cache_action) { switch (cache_action) {
case 0x00: case 0x00:
if (((eop_event_type == 0x04 && event_index == 0x05) || if (((eop_event_type == 0x04 && event_index == 0x05) ||
(eop_event_type == 0x28 && event_index == 0x00)) && (eop_event_type == 0x28 && event_index == 0x00)) &&
!with_interrupt) { !with_interrupt) {
GraphicsRenderWriteAtEndOfPipeClockCounter( Sync::WriteAtEndOfPipeClockCounter(
m_submit_id, CurrentBuffer(), static_cast<uint64_t*>(dst_gpu_addr), m_submit_id, CurrentBuffer(), static_cast<uint64_t*>(dst_gpu_addr),
clock); clock);
return; return;
@@ -1679,7 +1680,7 @@ void CommandProcessor::WriteAtEndOfPipe(uint32_t cache_policy, uint32_t event_wr
(event_index == 0x00 || event_index == 0x05)) || (event_index == 0x00 || event_index == 0x05)) ||
(eop_event_type == 0x28 && event_index == 0x00)) && (eop_event_type == 0x28 && event_index == 0x00)) &&
!with_interrupt) { !with_interrupt) {
GraphicsRenderWriteAtEndOfPipeClockCounterWithWriteBack( Sync::WriteAtEndOfPipeClockCounterWithWriteBack(
m_submit_id, CurrentBuffer(), static_cast<uint64_t*>(dst_gpu_addr), m_submit_id, CurrentBuffer(), static_cast<uint64_t*>(dst_gpu_addr),
clock); clock);
return; return;
@@ -1730,7 +1731,7 @@ void CommandProcessor::TriggerEopEventAtEndOfPipe(uint32_t interrupt_context_id)
CheckBuffer(); CheckBuffer();
GraphicsRenderTriggerEopEventAtEndOfPipe(CurrentBuffer(), interrupt_context_id); Sync::TriggerEopEventAtEndOfPipe(CurrentBuffer(), interrupt_context_id);
} }
void CommandProcessor::RenderTextureBarrier(uint64_t vaddr, uint64_t size) { void CommandProcessor::RenderTextureBarrier(uint64_t vaddr, uint64_t size) {
@@ -1813,9 +1814,9 @@ void CommandProcessor::Flip() {
} }
auto* command = CurrentBuffer(); auto* command = CurrentBuffer();
auto request = GraphicsRenderPrepareDisplayBufferFlip(command, m_flip.handle, m_flip.index, auto request = Sync::PrepareDisplayBufferFlip(command, m_flip.handle, m_flip.index,
m_flip.flip_mode, m_flip.flip_arg); m_flip.flip_mode, m_flip.flip_arg);
GraphicsRenderWriteAtEndOfPipeOnlyFlip(m_submit_id, command, m_flip.handle, m_flip.index, Sync::WriteAtEndOfPipeOnlyFlip(m_submit_id, command, m_flip.handle, m_flip.index,
m_flip.flip_mode, m_flip.flip_arg, request); m_flip.flip_mode, m_flip.flip_arg, request);
m_scheduler.Flush(); m_scheduler.Flush();
} }
@@ -1834,9 +1835,9 @@ void CommandProcessor::Flip(void* dst_gpu_addr, uint32_t value) {
std::memcpy(dst_gpu_addr, &value, sizeof(value)); std::memcpy(dst_gpu_addr, &value, sizeof(value));
auto* command = CurrentBuffer(); auto* command = CurrentBuffer();
auto request = GraphicsRenderPrepareDisplayBufferFlip(command, m_flip.handle, m_flip.index, auto request = Sync::PrepareDisplayBufferFlip(command, m_flip.handle, m_flip.index,
m_flip.flip_mode, m_flip.flip_arg); m_flip.flip_mode, m_flip.flip_arg);
GraphicsRenderWriteAtEndOfPipeWithFlip32( Sync::WriteAtEndOfPipeWithFlip32(
m_submit_id, command, static_cast<uint32_t*>(dst_gpu_addr), value, m_flip.handle, m_submit_id, command, static_cast<uint32_t*>(dst_gpu_addr), value, m_flip.handle,
m_flip.index, m_flip.flip_mode, m_flip.flip_arg, request); m_flip.index, m_flip.flip_mode, m_flip.flip_arg, request);
m_scheduler.Flush(); m_scheduler.Flush();
@@ -1862,9 +1863,9 @@ void CommandProcessor::FlipWithInterrupt(uint32_t eop_event_type, uint32_t cache
} }
std::memcpy(dst_gpu_addr, &value, sizeof(value)); std::memcpy(dst_gpu_addr, &value, sizeof(value));
auto* command = CurrentBuffer(); auto* command = CurrentBuffer();
auto request = GraphicsRenderPrepareDisplayBufferFlip(command, m_flip.handle, m_flip.index, auto request = Sync::PrepareDisplayBufferFlip(command, m_flip.handle, m_flip.index,
m_flip.flip_mode, m_flip.flip_arg); m_flip.flip_mode, m_flip.flip_arg);
GraphicsRenderWriteAtEndOfPipeWithInterruptWriteBackFlip32( Sync::WriteAtEndOfPipeWithInterruptWriteBackFlip32(
m_submit_id, command, static_cast<uint32_t*>(dst_gpu_addr), value, m_flip.handle, m_submit_id, command, static_cast<uint32_t*>(dst_gpu_addr), value, m_flip.handle,
m_flip.index, m_flip.flip_mode, m_flip.flip_arg, request); m_flip.index, m_flip.flip_mode, m_flip.flip_arg, request);
m_scheduler.Flush(); m_scheduler.Flush();
-57
View File
@@ -4,7 +4,6 @@
#include "common/abi.h" #include "common/abi.h"
#include "common/common.h" #include "common/common.h"
#include "graphics/host_gpu/renderer/streamBuffer.h" #include "graphics/host_gpu/renderer/streamBuffer.h"
#include "kernel/eventQueue.h"
#include <memory> #include <memory>
#include <vector> #include <vector>
@@ -144,10 +143,6 @@ void RenderDispatchDirect(uint64_t submit_id, CommandBuffer* buffer, HW::Context
void GraphicsRenderInit(); void GraphicsRenderInit();
void GraphicsRenderCreateContext(); void GraphicsRenderCreateContext();
[[nodiscard]] bool GraphicsScaleReferenceClock(uint64_t host_ticks, uint64_t host_frequency,
uint64_t* value);
[[nodiscard]] uint64_t GraphicsRenderReadReferenceClock();
[[nodiscard]] bool ResolveComputeImageClear(const ShaderComputeInputInfo& input, uint32_t group_x, [[nodiscard]] bool ResolveComputeImageClear(const ShaderComputeInputInfo& input, uint32_t group_x,
uint32_t group_y, uint32_t group_z, uint32_t mode, uint32_t group_y, uint32_t group_z, uint32_t mode,
ShaderBufferResource* descriptor, ShaderBufferResource* descriptor,
@@ -155,61 +150,9 @@ void GraphicsRenderCreateContext();
[[nodiscard]] bool ResolveHtileClearTarget(const HW::DepthRenderTarget& target, [[nodiscard]] bool ResolveHtileClearTarget(const HW::DepthRenderTarget& target,
uint64_t descriptor_size, HtileClearTarget* resolved); uint64_t descriptor_size, HtileClearTarget* resolved);
void GraphicsRenderWriteAtEndOfPipe64(uint64_t submit_id, CommandBuffer* buffer,
uint64_t* dst_gpu_addr, uint64_t value);
void GraphicsRenderWriteAtEndOfPipeClockCounter(uint64_t submit_id, CommandBuffer* buffer,
uint64_t* dst_gpu_addr, uint64_t value);
void GraphicsRenderWriteAtEndOfPipeClockCounterWithWriteBack(uint64_t submit_id,
CommandBuffer* buffer,
uint64_t* dst_gpu_addr,
uint64_t value);
void GraphicsRenderWriteAtEndOfPipe32(uint64_t submit_id, CommandBuffer* buffer,
uint32_t* dst_gpu_addr, uint32_t value);
void GraphicsRenderWriteAtEndOfPipeGds32(uint64_t submit_id, CommandBuffer* buffer,
uint32_t* dst_gpu_addr, uint32_t dw_offset,
uint32_t dw_num);
uint64_t GraphicsRenderPrepareDisplayBufferFlip(CommandBuffer* buffer, int handle, int index,
int flip_mode, int64_t flip_arg);
void GraphicsRenderWriteAtEndOfPipeWithInterruptWriteBackFlip32(
uint64_t submit_id, CommandBuffer* buffer, uint32_t* dst_gpu_addr, uint32_t value, int handle,
int index, int flip_mode, int64_t flip_arg, uint64_t request_id);
void GraphicsRenderWriteAtEndOfPipeWithFlip32(uint64_t submit_id, CommandBuffer* buffer,
uint32_t* dst_gpu_addr, uint32_t value, int handle,
int index, int flip_mode, int64_t flip_arg,
uint64_t request_id);
void GraphicsRenderWriteAtEndOfPipeOnlyFlip(uint64_t submit_id, CommandBuffer* buffer, int handle,
int index, int flip_mode, int64_t flip_arg,
uint64_t request_id);
void GraphicsRenderWriteAtEndOfPipeWithWriteBack64(uint64_t submit_id, CommandBuffer* buffer,
uint64_t* dst_gpu_addr, uint64_t value);
void GraphicsRenderWriteAtEndOfPipeWithWriteBack32(uint64_t submit_id, CommandBuffer* buffer,
uint32_t* dst_gpu_addr, uint32_t value);
void GraphicsRenderWriteAtEndOfPipeWithInterruptWriteBack64(uint64_t submit_id,
CommandBuffer* buffer,
uint64_t* dst_gpu_addr, uint64_t value,
uint32_t context_id = 0);
void GraphicsRenderWriteAtEndOfPipeWithInterruptWriteBack32(uint64_t submit_id,
CommandBuffer* buffer,
uint32_t* dst_gpu_addr, uint32_t value,
uint32_t context_id = 0);
void GraphicsRenderWriteAtEndOfPipeWithInterrupt64(uint64_t submit_id, CommandBuffer* buffer,
uint64_t* dst_gpu_addr, uint64_t value,
uint32_t context_id = 0);
void GraphicsRenderWriteAtEndOfPipeWithInterrupt32(uint64_t submit_id, CommandBuffer* buffer,
uint32_t* dst_gpu_addr, uint32_t value,
uint32_t context_id = 0);
void GraphicsRenderMemoryBarrier(CommandBuffer* buffer); void GraphicsRenderMemoryBarrier(CommandBuffer* buffer);
void GraphicsRenderTextureBarrier(CommandBuffer* buffer, uint64_t vaddr, uint64_t size); void GraphicsRenderTextureBarrier(CommandBuffer* buffer, uint64_t vaddr, uint64_t size);
void GraphicsRenderDepthStencilBarrier(CommandBuffer* buffer, uint64_t vaddr, uint64_t size); void GraphicsRenderDepthStencilBarrier(CommandBuffer* buffer, uint64_t vaddr, uint64_t size);
void GraphicsRenderDeleteBuffers();
void GraphicsRenderTriggerEopEventAtEndOfPipe(CommandBuffer* buffer, uint32_t context_id);
int GraphicsRenderAddEqEvent(LibKernel::EventQueue::KernelEqueue eq, int id, void* udata);
int GraphicsRenderDeleteEqEvent(LibKernel::EventQueue::KernelEqueue eq, int id);
void GraphicsRenderTriggerAgcUserInterrupt();
void GraphicsRenderTriggerEopEvent(uint32_t context_id);
void GraphicsRenderReadGds(uint32_t* dst, uint32_t dw_offset, uint32_t dw_size);
} // namespace Libs::Graphics } // namespace Libs::Graphics
+28 -27
View File
@@ -7,6 +7,7 @@
#include "graphics/host_gpu/renderer/bufferCache.h" #include "graphics/host_gpu/renderer/bufferCache.h"
#include "graphics/host_gpu/renderer/render.h" #include "graphics/host_gpu/renderer/render.h"
#include "graphics/host_gpu/renderer/renderContext.h" #include "graphics/host_gpu/renderer/renderContext.h"
#include "graphics/host_gpu/renderer/sync.h"
#include "graphics/presentation/displayBuffer.h" #include "graphics/presentation/displayBuffer.h"
#include "kernel/eventQueue.h" #include "kernel/eventQueue.h"
#include "kernel/pthread.h" #include "kernel/pthread.h"
@@ -14,13 +15,13 @@
#include <limits> #include <limits>
namespace Libs::Graphics { namespace Libs::Graphics::Sync {
constexpr int GRAPHICS_EVENT_QUEUED_GRAPHICS_INTERRUPT = 0x00; constexpr int GRAPHICS_EVENT_QUEUED_GRAPHICS_INTERRUPT = 0x00;
constexpr int GRAPHICS_EVENT_EOP = 0x40; constexpr int GRAPHICS_EVENT_EOP = 0x40;
constexpr uint64_t GRAPHICS_REFERENCE_CLOCK_FREQUENCY = 100000000; constexpr uint64_t GRAPHICS_REFERENCE_CLOCK_FREQUENCY = 100000000;
bool GraphicsScaleReferenceClock(uint64_t host_ticks, uint64_t host_frequency, uint64_t* value) { bool ScaleReferenceClock(uint64_t host_ticks, uint64_t host_frequency, uint64_t* value) {
if (host_frequency == 0 || value == nullptr) { if (host_frequency == 0 || value == nullptr) {
return false; return false;
} }
@@ -42,11 +43,11 @@ bool GraphicsScaleReferenceClock(uint64_t host_ticks, uint64_t host_frequency, u
return true; return true;
} }
uint64_t GraphicsRenderReadReferenceClock() { uint64_t ReadReferenceClock() {
const auto host_frequency = LibKernel::KernelGetTscFrequency(); const auto host_frequency = LibKernel::KernelGetTscFrequency();
const auto host_ticks = LibKernel::KernelReadTsc(); const auto host_ticks = LibKernel::KernelReadTsc();
uint64_t value = 0; uint64_t value = 0;
if (!GraphicsScaleReferenceClock(host_ticks, host_frequency, &value)) { if (!ScaleReferenceClock(host_ticks, host_frequency, &value)) {
EXIT("cannot scale host clock, ticks=0x%016" PRIx64 " frequency=%" PRIu64 "\n", host_ticks, EXIT("cannot scale host clock, ticks=0x%016" PRIx64 " frequency=%" PRIu64 "\n", host_ticks,
host_frequency); host_frequency);
} }
@@ -69,19 +70,19 @@ static bool CompleteDisplayBufferFlip(const uint64_t* args) {
return true; return true;
} }
void GraphicsRenderTriggerAgcUserInterrupt() { void TriggerAgcUserInterrupt() {
auto tsc = LibKernel::KernelReadTsc(); auto tsc = LibKernel::KernelReadTsc();
auto result = LibKernel::EventQueue::KernelTriggerUserEventForAll(AGC_USER_INTERRUPT_EVENT, auto result = LibKernel::EventQueue::KernelTriggerUserEventForAll(AGC_USER_INTERRUPT_EVENT,
reinterpret_cast<void*>(tsc)); reinterpret_cast<void*>(tsc));
EXIT_NOT_IMPLEMENTED(result != OK && result != LibKernel::KERNEL_ERROR_ENOENT); EXIT_NOT_IMPLEMENTED(result != OK && result != LibKernel::KERNEL_ERROR_ENOENT);
} }
void GraphicsRenderTriggerEopEvent(uint32_t context_id) { void TriggerEopEvent(uint32_t context_id) {
EXIT_IF(g_render_ctx == nullptr); EXIT_IF(g_render_ctx == nullptr);
g_render_ctx->TriggerEopEvent(context_id); g_render_ctx->TriggerEopEvent(context_id);
} }
void GraphicsRenderWriteAtEndOfPipe32(uint64_t submit_id, CommandBuffer* buffer, void WriteAtEndOfPipe32(uint64_t submit_id, CommandBuffer* buffer,
uint32_t* dst_gpu_addr, uint32_t value) { uint32_t* dst_gpu_addr, uint32_t value) {
EXIT_IF(g_render_ctx == nullptr); EXIT_IF(g_render_ctx == nullptr);
EXIT_IF(dst_gpu_addr == nullptr); EXIT_IF(dst_gpu_addr == nullptr);
@@ -92,7 +93,7 @@ void GraphicsRenderWriteAtEndOfPipe32(uint64_t submit_id, CommandBuffer* buffer,
0, 0, reinterpret_cast<uint64_t>(dst_gpu_addr)); 0, 0, reinterpret_cast<uint64_t>(dst_gpu_addr));
} }
void GraphicsRenderWriteAtEndOfPipeGds32(uint64_t submit_id, CommandBuffer* buffer, void WriteAtEndOfPipeGds32(uint64_t submit_id, CommandBuffer* buffer,
uint32_t* dst_gpu_addr, uint32_t dw_offset, uint32_t* dst_gpu_addr, uint32_t dw_offset,
uint32_t dw_num) { uint32_t dw_num) {
EXIT_IF(g_render_ctx == nullptr); EXIT_IF(g_render_ctx == nullptr);
@@ -104,7 +105,7 @@ void GraphicsRenderWriteAtEndOfPipeGds32(uint64_t submit_id, CommandBuffer* buff
dw_offset, dw_num, 0, 0, reinterpret_cast<uint64_t>(dst_gpu_addr)); dw_offset, dw_num, 0, 0, reinterpret_cast<uint64_t>(dst_gpu_addr));
} }
void GraphicsRenderWriteAtEndOfPipe64(uint64_t submit_id, CommandBuffer* buffer, void WriteAtEndOfPipe64(uint64_t submit_id, CommandBuffer* buffer,
uint64_t* dst_gpu_addr, uint64_t value) { uint64_t* dst_gpu_addr, uint64_t value) {
EXIT_IF(g_render_ctx == nullptr); EXIT_IF(g_render_ctx == nullptr);
EXIT_IF(dst_gpu_addr == nullptr); EXIT_IF(dst_gpu_addr == nullptr);
@@ -116,7 +117,7 @@ void GraphicsRenderWriteAtEndOfPipe64(uint64_t submit_id, CommandBuffer* buffer,
reinterpret_cast<uint64_t>(dst_gpu_addr)); reinterpret_cast<uint64_t>(dst_gpu_addr));
} }
void GraphicsRenderWriteAtEndOfPipeClockCounter(uint64_t submit_id, CommandBuffer* buffer, void WriteAtEndOfPipeClockCounter(uint64_t submit_id, CommandBuffer* buffer,
uint64_t* dst_gpu_addr, uint64_t value) { uint64_t* dst_gpu_addr, uint64_t value) {
EXIT_IF(g_render_ctx == nullptr); EXIT_IF(g_render_ctx == nullptr);
EXIT_IF(dst_gpu_addr == nullptr); EXIT_IF(dst_gpu_addr == nullptr);
@@ -131,7 +132,7 @@ void GraphicsRenderWriteAtEndOfPipeClockCounter(uint64_t submit_id, CommandBuffe
reinterpret_cast<uint64_t>(dst_gpu_addr), value); reinterpret_cast<uint64_t>(dst_gpu_addr), value);
} }
void GraphicsRenderWriteAtEndOfPipeClockCounterWithWriteBack(uint64_t submit_id, void WriteAtEndOfPipeClockCounterWithWriteBack(uint64_t submit_id,
CommandBuffer* buffer, CommandBuffer* buffer,
uint64_t* dst_gpu_addr, uint64_t* dst_gpu_addr,
uint64_t value) { uint64_t value) {
@@ -148,7 +149,7 @@ void GraphicsRenderWriteAtEndOfPipeClockCounterWithWriteBack(uint64_t subm
reinterpret_cast<uint64_t>(dst_gpu_addr), value); reinterpret_cast<uint64_t>(dst_gpu_addr), value);
} }
void GraphicsRenderWriteAtEndOfPipeWithWriteBack64(uint64_t submit_id, CommandBuffer* buffer, void WriteAtEndOfPipeWithWriteBack64(uint64_t submit_id, CommandBuffer* buffer,
uint64_t* dst_gpu_addr, uint64_t value) { uint64_t* dst_gpu_addr, uint64_t value) {
EXIT_IF(g_render_ctx == nullptr); EXIT_IF(g_render_ctx == nullptr);
EXIT_IF(dst_gpu_addr == nullptr); EXIT_IF(dst_gpu_addr == nullptr);
@@ -160,7 +161,7 @@ void GraphicsRenderWriteAtEndOfPipeWithWriteBack64(uint64_t submit_id, CommandBu
reinterpret_cast<uint64_t>(dst_gpu_addr)); reinterpret_cast<uint64_t>(dst_gpu_addr));
} }
void GraphicsRenderWriteAtEndOfPipeWithWriteBack32(uint64_t submit_id, CommandBuffer* buffer, void WriteAtEndOfPipeWithWriteBack32(uint64_t submit_id, CommandBuffer* buffer,
uint32_t* dst_gpu_addr, uint32_t value) { uint32_t* dst_gpu_addr, uint32_t value) {
EXIT_IF(g_render_ctx == nullptr); EXIT_IF(g_render_ctx == nullptr);
EXIT_IF(dst_gpu_addr == nullptr); EXIT_IF(dst_gpu_addr == nullptr);
@@ -171,7 +172,7 @@ void GraphicsRenderWriteAtEndOfPipeWithWriteBack32(uint64_t submit_id, CommandBu
value, 0, 0, reinterpret_cast<uint64_t>(dst_gpu_addr)); value, 0, 0, reinterpret_cast<uint64_t>(dst_gpu_addr));
} }
void GraphicsRenderWriteAtEndOfPipeWithInterruptWriteBack64(uint64_t submit_id, void WriteAtEndOfPipeWithInterruptWriteBack64(uint64_t submit_id,
CommandBuffer* buffer, CommandBuffer* buffer,
uint64_t* dst_gpu_addr, uint64_t value, uint64_t* dst_gpu_addr, uint64_t value,
uint32_t context_id) { uint32_t context_id) {
@@ -196,7 +197,7 @@ void GraphicsRenderWriteAtEndOfPipeWithInterruptWriteBack64(uint64_t submi
args); args);
} }
void GraphicsRenderWriteAtEndOfPipeWithInterruptWriteBack32(uint64_t submit_id, void WriteAtEndOfPipeWithInterruptWriteBack32(uint64_t submit_id,
CommandBuffer* buffer, CommandBuffer* buffer,
uint32_t* dst_gpu_addr, uint32_t value, uint32_t* dst_gpu_addr, uint32_t value,
uint32_t context_id) { uint32_t context_id) {
@@ -219,7 +220,7 @@ void GraphicsRenderWriteAtEndOfPipeWithInterruptWriteBack32(uint64_t submi
args); args);
} }
void GraphicsRenderWriteAtEndOfPipeWithInterrupt64(uint64_t submit_id, CommandBuffer* buffer, void WriteAtEndOfPipeWithInterrupt64(uint64_t submit_id, CommandBuffer* buffer,
uint64_t* dst_gpu_addr, uint64_t value, uint64_t* dst_gpu_addr, uint64_t value,
uint32_t context_id) { uint32_t context_id) {
EXIT_IF(g_render_ctx == nullptr); EXIT_IF(g_render_ctx == nullptr);
@@ -243,7 +244,7 @@ void GraphicsRenderWriteAtEndOfPipeWithInterrupt64(uint64_t submit_id, CommandBu
args); args);
} }
void GraphicsRenderWriteAtEndOfPipeWithInterrupt32(uint64_t submit_id, CommandBuffer* buffer, void WriteAtEndOfPipeWithInterrupt32(uint64_t submit_id, CommandBuffer* buffer,
uint32_t* dst_gpu_addr, uint32_t value, uint32_t* dst_gpu_addr, uint32_t value,
uint32_t context_id) { uint32_t context_id) {
EXIT_IF(g_render_ctx == nullptr); EXIT_IF(g_render_ctx == nullptr);
@@ -265,7 +266,7 @@ void GraphicsRenderWriteAtEndOfPipeWithInterrupt32(uint64_t submit_id, CommandBu
args); args);
} }
uint64_t GraphicsRenderPrepareDisplayBufferFlip(CommandBuffer* buffer, int handle, int index, uint64_t PrepareDisplayBufferFlip(CommandBuffer* buffer, int handle, int index,
int flip_mode, int64_t flip_arg) { int flip_mode, int64_t flip_arg) {
for (;;) { for (;;) {
uint64_t request_id = 0; uint64_t request_id = 0;
@@ -284,7 +285,7 @@ uint64_t GraphicsRenderPrepareDisplayBufferFlip(CommandBuffer* buffer, int handl
} }
} }
void GraphicsRenderWriteAtEndOfPipeWithInterruptWriteBackFlip32( void WriteAtEndOfPipeWithInterruptWriteBackFlip32(
uint64_t submit_id, CommandBuffer* buffer, uint32_t* dst_gpu_addr, uint32_t value, int handle, uint64_t submit_id, CommandBuffer* buffer, uint32_t* dst_gpu_addr, uint32_t value, int handle,
int index, int flip_mode, int64_t flip_arg, uint64_t request_id) { int index, int flip_mode, int64_t flip_arg, uint64_t request_id) {
EXIT_IF(g_render_ctx == nullptr); EXIT_IF(g_render_ctx == nullptr);
@@ -306,7 +307,7 @@ void GraphicsRenderWriteAtEndOfPipeWithInterruptWriteBackFlip32(
args); args);
} }
void GraphicsRenderWriteAtEndOfPipeWithFlip32(uint64_t submit_id, CommandBuffer* buffer, void WriteAtEndOfPipeWithFlip32(uint64_t submit_id, CommandBuffer* buffer,
uint32_t* dst_gpu_addr, uint32_t value, int handle, uint32_t* dst_gpu_addr, uint32_t value, int handle,
int index, int flip_mode, int64_t flip_arg, int index, int flip_mode, int64_t flip_arg,
uint64_t request_id) { uint64_t request_id) {
@@ -322,7 +323,7 @@ void GraphicsRenderWriteAtEndOfPipeWithFlip32(uint64_t submit_id, CommandBuffer*
SubmitLabel(buffer, CompleteDisplayBufferFlip, nullptr, args); SubmitLabel(buffer, CompleteDisplayBufferFlip, nullptr, args);
} }
void GraphicsRenderWriteAtEndOfPipeOnlyFlip(uint64_t submit_id, CommandBuffer* buffer, int handle, void WriteAtEndOfPipeOnlyFlip(uint64_t submit_id, CommandBuffer* buffer, int handle,
int index, int flip_mode, int64_t flip_arg, int index, int flip_mode, int64_t flip_arg,
uint64_t request_id) { uint64_t request_id) {
EXIT_IF(g_render_ctx == nullptr); EXIT_IF(g_render_ctx == nullptr);
@@ -337,7 +338,7 @@ void GraphicsRenderWriteAtEndOfPipeOnlyFlip(uint64_t submit_id, CommandBuffer* b
SubmitLabel(buffer, CompleteDisplayBufferFlip, nullptr, args); SubmitLabel(buffer, CompleteDisplayBufferFlip, nullptr, args);
} }
void GraphicsRenderTriggerEopEventAtEndOfPipe(CommandBuffer* buffer, uint32_t context_id) { void TriggerEopEventAtEndOfPipe(CommandBuffer* buffer, uint32_t context_id) {
EXIT_IF(g_render_ctx == nullptr); EXIT_IF(g_render_ctx == nullptr);
EXIT_IF(buffer == nullptr); EXIT_IF(buffer == nullptr);
EXIT_IF(buffer->IsInvalid()); EXIT_IF(buffer->IsInvalid());
@@ -387,7 +388,7 @@ static void EopEventTriggerFunc(LibKernel::EventQueue::KernelEqueueEvent* event,
} }
} }
int GraphicsRenderAddEqEvent(LibKernel::EventQueue::KernelEqueue eq, int id, void* udata) { int AddEqEvent(LibKernel::EventQueue::KernelEqueue eq, int id, void* udata) {
EXIT_IF(g_render_ctx == nullptr); EXIT_IF(g_render_ctx == nullptr);
LibKernel::EventQueue::KernelEqueueEvent event; LibKernel::EventQueue::KernelEqueueEvent event;
@@ -411,7 +412,7 @@ int GraphicsRenderAddEqEvent(LibKernel::EventQueue::KernelEqueue eq, int id, voi
return result; return result;
} }
int GraphicsRenderDeleteEqEvent(LibKernel::EventQueue::KernelEqueue eq, int id) { int DeleteEqEvent(LibKernel::EventQueue::KernelEqueue eq, int id) {
EXIT_IF(g_render_ctx == nullptr); EXIT_IF(g_render_ctx == nullptr);
int result = LibKernel::EventQueue::KernelDeleteEvent( int result = LibKernel::EventQueue::KernelDeleteEvent(
@@ -420,15 +421,15 @@ int GraphicsRenderDeleteEqEvent(LibKernel::EventQueue::KernelEqueue eq, int id)
return result; return result;
} }
void GraphicsRenderReadGds(uint32_t* dst, uint32_t dw_offset, uint32_t dw_size) { void ReadGds(uint32_t* dst, uint32_t dw_offset, uint32_t dw_size) {
EXIT_IF(g_render_ctx == nullptr); EXIT_IF(g_render_ctx == nullptr);
g_render_ctx->GetGdsBuffer()->Read(g_render_ctx->GetGraphicCtx(), dst, dw_offset, dw_size); g_render_ctx->GetGdsBuffer()->Read(g_render_ctx->GetGraphicCtx(), dst, dw_offset, dw_size);
} }
void GraphicsRenderDeleteBuffers() { void DeleteBuffers() {
EXIT_IF(g_render_ctx == nullptr); EXIT_IF(g_render_ctx == nullptr);
g_render_ctx->GetBufferCache()->DeleteAll(g_render_ctx->GetGraphicCtx()); g_render_ctx->GetBufferCache()->DeleteAll(g_render_ctx->GetGraphicCtx());
} }
} // namespace Libs::Graphics } // namespace Libs::Graphics::Sync
+69
View File
@@ -0,0 +1,69 @@
#ifndef EMULATOR_SRC_GRAPHICS_HOST_GPU_RENDERER_SYNC_H_
#define EMULATOR_SRC_GRAPHICS_HOST_GPU_RENDERER_SYNC_H_
#include "kernel/eventQueue.h"
#include <cstdint>
namespace Libs::Graphics {
class CommandBuffer;
namespace Sync {
[[nodiscard]] bool ScaleReferenceClock(uint64_t host_ticks, uint64_t host_frequency,
uint64_t* value);
[[nodiscard]] uint64_t ReadReferenceClock();
void TriggerAgcUserInterrupt();
void TriggerEopEvent(uint32_t context_id);
void TriggerEopEventAtEndOfPipe(CommandBuffer* buffer, uint32_t context_id);
void WriteAtEndOfPipe32(uint64_t submit_id, CommandBuffer* buffer, uint32_t* dst_gpu_addr,
uint32_t value);
void WriteAtEndOfPipe64(uint64_t submit_id, CommandBuffer* buffer, uint64_t* dst_gpu_addr,
uint64_t value);
void WriteAtEndOfPipeGds32(uint64_t submit_id, CommandBuffer* buffer, uint32_t* dst_gpu_addr,
uint32_t dw_offset, uint32_t dw_num);
void WriteAtEndOfPipeClockCounter(uint64_t submit_id, CommandBuffer* buffer,
uint64_t* dst_gpu_addr, uint64_t value);
void WriteAtEndOfPipeClockCounterWithWriteBack(uint64_t submit_id, CommandBuffer* buffer,
uint64_t* dst_gpu_addr, uint64_t value);
void WriteAtEndOfPipeWithWriteBack32(uint64_t submit_id, CommandBuffer* buffer,
uint32_t* dst_gpu_addr, uint32_t value);
void WriteAtEndOfPipeWithWriteBack64(uint64_t submit_id, CommandBuffer* buffer,
uint64_t* dst_gpu_addr, uint64_t value);
void WriteAtEndOfPipeWithInterrupt32(uint64_t submit_id, CommandBuffer* buffer,
uint32_t* dst_gpu_addr, uint32_t value,
uint32_t context_id = 0);
void WriteAtEndOfPipeWithInterrupt64(uint64_t submit_id, CommandBuffer* buffer,
uint64_t* dst_gpu_addr, uint64_t value,
uint32_t context_id = 0);
void WriteAtEndOfPipeWithInterruptWriteBack32(uint64_t submit_id, CommandBuffer* buffer,
uint32_t* dst_gpu_addr, uint32_t value,
uint32_t context_id = 0);
void WriteAtEndOfPipeWithInterruptWriteBack64(uint64_t submit_id, CommandBuffer* buffer,
uint64_t* dst_gpu_addr, uint64_t value,
uint32_t context_id = 0);
[[nodiscard]] uint64_t PrepareDisplayBufferFlip(CommandBuffer* buffer, int handle, int index,
int flip_mode, int64_t flip_arg);
void WriteAtEndOfPipeOnlyFlip(uint64_t submit_id, CommandBuffer* buffer, int handle, int index,
int flip_mode, int64_t flip_arg, uint64_t request_id);
void WriteAtEndOfPipeWithFlip32(uint64_t submit_id, CommandBuffer* buffer,
uint32_t* dst_gpu_addr, uint32_t value, int handle, int index,
int flip_mode, int64_t flip_arg, uint64_t request_id);
void WriteAtEndOfPipeWithInterruptWriteBackFlip32(uint64_t submit_id, CommandBuffer* buffer,
uint32_t* dst_gpu_addr, uint32_t value,
int handle, int index, int flip_mode,
int64_t flip_arg, uint64_t request_id);
int AddEqEvent(LibKernel::EventQueue::KernelEqueue eq, int id, void* udata);
int DeleteEqEvent(LibKernel::EventQueue::KernelEqueue eq, int id);
void ReadGds(uint32_t* dst, uint32_t dw_offset, uint32_t dw_size);
void DeleteBuffers();
} // namespace Sync
} // namespace Libs::Graphics
#endif // EMULATOR_SRC_GRAPHICS_HOST_GPU_RENDERER_SYNC_H_
+3 -2
View File
@@ -13,6 +13,7 @@
#include "graphics/guest_gpu/tile.h" #include "graphics/guest_gpu/tile.h"
#include "graphics/host_gpu/objects/label.h" #include "graphics/host_gpu/objects/label.h"
#include "graphics/host_gpu/renderer/render.h" #include "graphics/host_gpu/renderer/render.h"
#include "graphics/host_gpu/renderer/sync.h"
#include "graphics/presentation/renderDoc.h" #include "graphics/presentation/renderDoc.h"
#include "graphics/presentation/videoOut.h" #include "graphics/presentation/videoOut.h"
#include "graphics/presentation/window.h" #include "graphics/presentation/window.h"
@@ -4004,7 +4005,7 @@ int KYTY_SYSV_ABI GraphicsDriverAddEqEvent(LibKernel::EventQueue::KernelEqueue e
return LibKernel::KERNEL_ERROR_EBADF; return LibKernel::KERNEL_ERROR_EBADF;
} }
return GraphicsRenderAddEqEvent(eq, id, udata); return Sync::AddEqEvent(eq, id, udata);
} }
int KYTY_SYSV_ABI GraphicsDriverDeleteEqEvent(LibKernel::EventQueue::KernelEqueue eq, int id) { int KYTY_SYSV_ABI GraphicsDriverDeleteEqEvent(LibKernel::EventQueue::KernelEqueue eq, int id) {
@@ -4014,7 +4015,7 @@ int KYTY_SYSV_ABI GraphicsDriverDeleteEqEvent(LibKernel::EventQueue::KernelEqueu
return LibKernel::KERNEL_ERROR_EBADF; return LibKernel::KERNEL_ERROR_EBADF;
} }
return GraphicsRenderDeleteEqEvent(eq, id); return Sync::DeleteEqEvent(eq, id);
} }
int KYTY_SYSV_ABI GraphicsDriverGetEqEventType(const LibKernel::EventQueue::KernelEvent* ev) { int KYTY_SYSV_ABI GraphicsDriverGetEqEventType(const LibKernel::EventQueue::KernelEvent* ev) {
+8 -7
View File
@@ -15,6 +15,7 @@
#include "graphics/host_gpu/renderer/image.h" #include "graphics/host_gpu/renderer/image.h"
#include "graphics/host_gpu/renderer/imageView.h" #include "graphics/host_gpu/renderer/imageView.h"
#include "graphics/host_gpu/renderer/render.h" #include "graphics/host_gpu/renderer/render.h"
#include "graphics/host_gpu/renderer/sync.h"
#include "graphics/host_gpu/renderer/renderDraw.h" #include "graphics/host_gpu/renderer/renderDraw.h"
#include "graphics/host_gpu/renderer/renderTarget.h" #include "graphics/host_gpu/renderer/renderTarget.h"
#include "graphics/host_gpu/renderer/renderVertex.h" #include "graphics/host_gpu/renderer/renderVertex.h"
@@ -11944,24 +11945,24 @@ void CheckEmbeddedFetchLaneSpill() {
void CheckReferenceClockScale() { void CheckReferenceClockScale() {
uint64_t value = 0; uint64_t value = 0;
Require("ReferenceClockScale", "zero", Require("ReferenceClockScale", "zero",
GraphicsScaleReferenceClock(0, 3000000000ull, &value) && value == 0, Sync::ScaleReferenceClock(0, 3000000000ull, &value) && value == 0,
"zero host tick did not produce a zero GPU clock"); "zero host tick did not produce a zero GPU clock");
Require("ReferenceClockScale", "fractional second", Require("ReferenceClockScale", "fractional second",
GraphicsScaleReferenceClock(1500000000ull, 3000000000ull, &value) && Sync::ScaleReferenceClock(1500000000ull, 3000000000ull, &value) &&
value == 50000000ull, value == 50000000ull,
"host half-second did not scale to 50,000,000 ticks"); "host half-second did not scale to 50,000,000 ticks");
Require("ReferenceClockScale", "whole and fractional", Require("ReferenceClockScale", "whole and fractional",
GraphicsScaleReferenceClock(3750000000ull, 3000000000ull, &value) && Sync::ScaleReferenceClock(3750000000ull, 3000000000ull, &value) &&
value == 125000000ull, value == 125000000ull,
"host 1.25 seconds did not scale to 125,000,000 ticks"); "host 1.25 seconds did not scale to 125,000,000 ticks");
Require("ReferenceClockScale", "monotonic floor", Require("ReferenceClockScale", "monotonic floor",
GraphicsScaleReferenceClock(3750000001ull, 3000000000ull, &value) && Sync::ScaleReferenceClock(3750000001ull, 3000000000ull, &value) &&
value == 125000000ull, value == 125000000ull,
"sub-reference-tick increment did not use a monotonic floor"); "sub-reference-tick increment did not use a monotonic floor");
Require("ReferenceClockScale", "guards", Require("ReferenceClockScale", "guards",
!GraphicsScaleReferenceClock(1, 0, &value) && !Sync::ScaleReferenceClock(1, 0, &value) &&
!GraphicsScaleReferenceClock(1, 1, nullptr) && !Sync::ScaleReferenceClock(1, 1, nullptr) &&
!GraphicsScaleReferenceClock(UINT64_MAX, 1, &value), !Sync::ScaleReferenceClock(UINT64_MAX, 1, &value),
"invalid frequency, destination, or overflow was accepted"); "invalid frequency, destination, or overflow was accepted");
std::printf("[host] %-32s ok\n", "ReferenceClockScale"); std::printf("[host] %-32s ok\n", "ReferenceClockScale");
} }